sql server—基于不同条件从同一个表中将一列数据拆分为两列的单个查询[sql]

x3naxklr  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(565)

我在一个表中有以下数据,这是一个包含多列的表中显示的单列,但只需要使用查询将此列中的数据拉入两列输出中:

  1. +----------------+--+
  2. | DataText | |
  3. | 1 DEC20 DDD | |
  4. | 1 JUL20 DDD | |
  5. | 1 JAN21 DDD | |
  6. | 1 JUN20 DDD500 | |
  7. | 1 JUN20 DDD500 | |
  8. | 1 JUN20DDDD500 | |
  9. | 1 JUN20DDDD500 | |
  10. | 1 JUL20 DDD800 | |
  11. | 1 JUL20 DDD800 | |
  12. | 1 JUL20DDDD800 | |
  13. | 1 JUL20DDDD400 | |
  14. | 1 JUL20DDDD400 | |
  15. +----------------+--+

所需结果:基于数据的前13个字符的不同值,根据“长数据”和“短数据”分为两列,但仅为两列的输出提供前13个字符:

  1. +-------------+-------------+
  2. | ShortData | LongData |
  3. | 1 DEC20 DDD | 1 JUN20 DDD |
  4. | 1 JUL20 DDD | 1 JUN20DDDD |
  5. | 1 JAN21 DDD | 1 JUL20 DDD |
  6. | | 1 JUL20DDDD |
  7. +-------------+-------------+

比如:

  1. Select
  2. (Select DISTINCT LEFT(DataText,13)
  3. From myTable)
  4. Where LEN(DataText)=13) As ShortData
  5. ,
  6. (Select DISTINCT LEFT(DataText,13)
  7. From myTable)
  8. Where LEN(DataText)>13) As LongData

如果可能的话,我还想查询/扫描表一次。我无法修改任何这样的示例以使这样的查询工作。

crcmnpdw

crcmnpdw1#

这很难看,但可行。作为初学者,您需要一个列来定义行的顺序—我假设您有这样一个列,这就是 id .
然后,您可以选择不同的文本,根据它们的长度将它们分为不同的组,最后再旋转:

  1. select
  2. max(case when grp = 0 then dataText end) shortData,
  3. max(case when grp = 1 then dataText end) longData
  4. from (
  5. select
  6. dataText,
  7. grp,
  8. row_number() over(partition by grp order by id) rn
  9. from (
  10. select
  11. id,
  12. case when len(dataText) <= 13 then 0 else 1 end grp,
  13. substring(dataText, 1, 13) dataText
  14. from (select min(id) id, dataText from mytable group by dataText) t
  15. ) t
  16. ) t
  17. group by rn

如果您满足于按字符串列本身对记录进行排序,那么就简单了一点(而且,对于示例数据,它会产生相同的结果):

  1. select
  2. max(case when grp = 0 then dataText end) shortData,
  3. max(case when grp = 1 then dataText end) longData
  4. from (
  5. select
  6. dataText,
  7. grp,
  8. row_number() over(partition by grp order by dataText) rn
  9. from (
  10. select distinct
  11. case when len(dataText) <= 13 then 0 else 1 end grp,
  12. substring(dataText, 1, 13) dataText
  13. from mytable
  14. ) t
  15. ) t
  16. group by rn

db小提琴演示:

  1. shortData | longData
  2. :---------- | :------------
  3. 1 DEC20 DDD | 1 JUL20 DDD80
  4. 1 JAN21 DDD | 1 JUL20DDDD40
  5. 1 JUL20 DDD | 1 JUL20DDDD80
  6. null | 1 JUN20 DDD50
  7. null | 1 JUN20DDDD50
展开查看全部

相关问题