表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;

Sql相关问答推荐

Oracle SQL中的累计总数

如何将多个 Select 查询从一个表中组合出来

SQL查询以条件空值跟踪生产操作结果进展

使用交叉应用透视表在SQL中转换分段时间段&

通过 Select 值的顺序进行排序ClickHouse

如何根据计数和分组获取订单总数

如何在PostgreSQL中对第1,1,1,1,2,2,2,2行进行编号

基于另一个(SAS、SQL)中的值更新列

使用特定的Order By子句随机化SQL输出

如何在 golang squirrel lib 中添加 postgreSQL 的distinct on

替换SQL Server XML中多处出现的 node 值

日期逻辑(查找过go 90 天内的第一个匹配行)

在 postgres 中插入或更新 jsonb 数组的对象

多行状态下的分组查询判断状态

基于 Snowflake 的最大值创建新列

MS ACCESS 错误插入 X(...) 从 A 联合 Select ... 从 B

我需要遍历权重值表并确定每个权重是否有效

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

从每行中排除最大元素

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON