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

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

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

+----------------+--+
| DataText       |  |
| 1 DEC20 DDD    |  |
| 1 JUL20 DDD    |  |
| 1 JAN21 DDD    |  |
| 1 JUN20 DDD500 |  |
| 1 JUN20 DDD500 |  |
| 1 JUN20DDDD500 |  |
| 1 JUN20DDDD500 |  |
| 1 JUL20 DDD800 |  |
| 1 JUL20 DDD800 |  |
| 1 JUL20DDDD800 |  |
| 1 JUL20DDDD400 |  |
| 1 JUL20DDDD400 |  |
+----------------+--+

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

+-------------+-------------+
| ShortData   | LongData    |
| 1 DEC20 DDD | 1 JUN20 DDD |
| 1 JUL20 DDD | 1 JUN20DDDD |
| 1 JAN21 DDD | 1 JUL20 DDD |
|             | 1 JUL20DDDD |
+-------------+-------------+

比如:

Select
(Select DISTINCT LEFT(DataText,13)
From myTable)
Where LEN(DataText)=13) As ShortData
 ,
(Select DISTINCT LEFT(DataText,13)
From myTable)
Where LEN(DataText)>13) As LongData

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

crcmnpdw

crcmnpdw1#

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

select
    max(case when grp = 0 then dataText end) shortData,
    max(case when grp = 1 then dataText end) longData
from (
    select 
        dataText, 
        grp,
        row_number() over(partition by grp order by id) rn
    from (
        select
            id,
            case when len(dataText) <= 13 then 0 else 1 end grp,
            substring(dataText, 1, 13) dataText 
        from (select min(id) id, dataText from mytable group by dataText) t
    ) t
) t
group by rn

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

select
    max(case when grp = 0 then dataText end) shortData,
    max(case when grp = 1 then dataText end) longData
from (
    select 
        dataText, 
        grp,
        row_number() over(partition by grp order by dataText) rn
    from (
        select distinct
            case when len(dataText) <= 13 then 0 else 1 end grp,
            substring(dataText, 1, 13) dataText 
        from mytable
    ) t
) t
group by rn

db小提琴演示:

shortData   | longData     
:---------- | :------------
1 DEC20 DDD | 1 JUL20 DDD80
1 JAN21 DDD | 1 JUL20DDDD40
1 JUL20 DDD | 1 JUL20DDDD80
null        | 1 JUN20 DDD50
null        | 1 JUN20DDDD50

相关问题