列(值不为空)到其他有序列

问题描述 投票:0回答:1

表 A 包含 6 列(cola、colb、colc、cold、cole、colf)。

一行可能包含以下值:null、'orange'、'cat'、null、null、'dog'

我需要将不为空的值返回到新表(或视图)中,但按顺序返回到新列中,如下所示:

Col_1, Col_2, Col_3, Col_4, Col_5, Col_6
'orange', 'cat', 'dog', null, null, null

实现这一目标最有效的方法是什么?

sql sql-server tsql multiple-columns
1个回答
0
投票

老实说,这听起来真正的问题是你的设计;闻起来就像是非规范化的。需要对列中的值进行重新排序可能意味着您要使用多个列多次存储相同的值。您真正应该做的是通过创建第二个表来标准化您的设计,其中每个值有one行。那么你就不再局限于 always 有 6 个值;你可以有 1、9 甚至 0。

但是,如果您确实需要这样做,一种方法是取消数据透视,重新编号,然后重新透视它们。如果您真的担心性能,那么标准化也是您的解决方案:

WITH RNs AS(
    SELECT V.YourIDColumn,
           U.I,
           U.Col,
           ROW_NUMBER() OVER (ORDER BY IIF(U.Col IS NULL,1,0),U.I) AS RN
    FROM (VALUES(1,null, 'orange', 'cat', null, null, 'dog'))V(YourIDColumn,ColA,ColB,ColC,ColD,ColE,ColF)
         CROSS APPLY (VALUES(1,ColA),
                            (2,ColB),
                            (3,ColC),
                            (4,ColD),
                            (5,ColE),
                            (6,ColF))U(I,Col))
SELECT YourIDColumn,
       MAX(CASE RN WHEN 1 THEN Col END) AS ColA,
       MAX(CASE RN WHEN 2 THEN Col END) AS ColB,
       MAX(CASE RN WHEN 3 THEN Col END) AS ColC,
       MAX(CASE RN WHEN 4 THEN Col END) AS ColD,
       MAX(CASE RN WHEN 5 THEN Col END) AS ColE,
       MAX(CASE RN WHEN 6 THEN Col END) AS ColF
FROM RNs
GROUP BY YourIDColumn;
© www.soinside.com 2019 - 2024. All rights reserved.