表A包含6列(Cola、Colb、CoLC、Cool、Cole、Colf).
行可能包含以下值:NULL、‘ORANLE’、‘CAT’、NULL、NULL、‘DOG’
我需要将其中不为空的值按顺序返回到新表(或视图)中,并返回到新列中,如下所示:
Col_1, Col_2, Col_3, Col_4, Col_5, Col_6
'orange', 'cat', 'dog', null, null, null
实现这一目标的最有效方法是什么?
表A包含6列(Cola、Colb、CoLC、Cool、Cole、Colf).
行可能包含以下值:NULL、‘ORANLE’、‘CAT’、NULL、NULL、‘DOG’
我需要将其中不为空的值按顺序返回到新表(或视图)中,并返回到新列中,如下所示:
Col_1, Col_2, Col_3, Col_4, Col_5, Col_6
'orange', 'cat', 'dog', null, null, null
实现这一目标的最有效方法是什么?
老实说,这闻起来真正的问题是你的设计;它闻起来像是不正常的.需要对列中的值进行排序可能意味着您要使用多个列来多次存储相同的值.您真正应该做的是通过创建第二个每个值有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;