我正在尝试跨多个列旋转一个表,这些列可能包含 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 分组。
条件
这是我到目前为止想到的,给我一行,每个 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
你的问题不清楚。 首先,尝试将您的数据转换为
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 | 空 |
然后旋转到所需的形状。