SQL Transact,具有条件和空值的多列透视

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

我正在尝试跨多个列旋转一个表,这些列可能包含 NULL 值,同时包含条件,将垂直数据集转换为具有 1 个观察值的水平数据集。这将创建 n 个 c_id、op、cs_score、sp_score 列和结果值。

DECLARE @Table1 TABLE
    (
      id VARCHAR(1) NOT NULL
     ,c_Id INT NOT NULL
     ,op FLOAT NULL
     ,score FLOAT NULL
     ,sp_Id INT NULL     
     ,p VARCHAR(2) NULL
    ) 

INSERT INTO @Table1 
    (id, c_Id, op, score, sp_Id, p)
VALUES ('1', '1', '51', '4','2','a')
      ,('1', '2', NULL, '3','1',NULL)
      ,('1', '3','20', '4',NULL,'a')
      ,('1', '4', '20', '4','5','a')
      ,('1', '5', '9', '4','4','a')
      ; 

数据是这样的

id c_Id op 分数 sp_id p
1 1 51 4 2 a
1 2 3 1
1 3 20 4 a
1 4 20 4 5 a
1 5 9 4 4 a

我正在尝试通过 id 创建一个带有单个观察的输出,如下所示,抱歉无法显示太宽的表输出,希望这是清楚的。

    INSERT INTO @Table2 
        (p,id,sum_op,c_id1,op1,c1_score,sp1_id,sp1_score,c_id2,op2,c2_score,sp2_id,sp2_score,c_id3,op3,c3_score,sp3_id,sp3_score,c_id4,op4,c4_score,sp4_id,sp4_score,c_id5,op5,c5_score,sp_5id,sp5_score)
    
    VALUES ('a','1','100','1','51','4','2','3','3','20','4',NULL,NULL,'4','20','4','5',NULL,'5','9','4','4',NULL)
p id sum_op c_id1 op1 c1_分数 sp1_id sp1_分数 c_id2 op2 c2_分数 sp2_id sp2_分数 c_id3 op3 c3_分数 sp3_id sp3_分数 c_id4 op4 c4_分数 sp4_id sp4_分数
a 1 100 1 51 4 2 3 3 20 4 4 20 4 5 5 9 4 4

我想对所有 op...n 的 op 值进行求和,在查看当前数据时,有时会 > 4 个,最多 11 个按 id 分组。

条件

  • 当 op 为 NULL 或 0 时显示 sp_score...n 值
  • 当 op >0 sp_core...n 值将为 NULL,在这种情况下,我们显示与 c_Id...n 而不是 sp_id....n 相关的分数

这是我到目前为止想到的,给我一行,每个 c_Id 与 id 相关联

select id,
 max(case when seq = 1 then c_Id end) as [cId_1],
 max(case when seq = 2 then c_Id end) as [c_Id_2],
 max(case when seq = 3 then c_Id end) as [c_Id_3],
 max(case when seq = 4 then c_Id end) as [c_Id_4],
 max(case when seq = 5 then c_Id end) as [c_Id_5],
 max(case when seq = 6 then c_Id end) as [c_Id_6],
 max(case when seq = 7 then c_Id end) as [c_Id_7],
 max(case when seq = 8 then c_Id end) as [c_Id_8],
 max(case when seq = 9 then c_Id end) as [c_Id_9],
 max(case when seq = 10 then c_Id end) as [c_Id_10],
 max(case when seq = 11 then c_Id end) as [c_Id_11]

from (select t.*, 
        row_number() over (partition by id order by id) as seq
        from table1 t
        ) t

group by id
order by id
sql pivot pivot-table case
1个回答
0
投票

你的问题不清楚。 首先,尝试将您的数据转换为

p id sum_op c_id op c_分数 sp_id sp_分数
a 1 100 1 51 4 2 3
a 1 100 3 20 4
a 1 100 4 20 4 5
a 1 100 5 9 4 4

然后旋转到所需的形状。

© www.soinside.com 2019 - 2024. All rights reserved.