我就直接切入正题了。我目前已将较大的表格缩小为如下所示:
Key Group Data1 Data2 Data3
===== ======= ======= ======= =======
AAA A 1 0 0
ASD A 1 1 0
FSD A 1 0 1
BAS A 1 1 1
CDR B 1 1 1
KLW B 1 0 1
以下是创建和填充它的代码:
CREATE TABLE #DataGroups
(
[Key] VARCHAR(25),
[Group] VARCHAR(25),
[Data1] BIT,
[Data2] BIT,
[Data3] BIT
)
INSERT INTO #DataGroups VALUES
('AAA', 'A', 1, 0, 0),
('ASD', 'A', 1, 1, 0),
('FSD', 'A', 1, 0, 1),
('BAS', 'A', 1, 1, 1),
('CDR', 'B', 1, 1, 1),
('KLW', 'B', 1, 0, 1)
约束如下:
- “ key ”是唯一的
- ('Group', 'Data1', 'Data2', 'Data3') 是唯一的
- 'Data1' 将始终为 1(但是我不知道这是否与解决方案相关,我们可以假设它可能并不总是为 1)
我需要做的是制定一个查询,以以下方式重新排列数据:
Group Data1 Data12 Data13 Data123
======= ======== ========= ======== =========
A AAA ASD FSD BAS
B NULL NULL KLW CDR
根据此表,我需要根据每个组的数据值获取 key 。因此,对于数据 1 列,我需要获取组中 Data1 = 1、Data2 = 0 和 Data3 = 0 的键。如果这没有意义,请告诉我是否应该澄清。
我对 SQL 不太有经验,所以我更喜欢尽可能干净的解决方案。我知道,由于我要将行数据转换为列,所以我很可能需要使用 PIVOT,但我不完全确定。即使对我需要使用什么类型的函数/聚合来解决这个问题提供一点帮助,我也会非常感激。
抱歉,我已经尝试提出自己的解决方案来尝试开始使用 PIVOT,但我似乎无法找到一个接近我想要的解决方案。
最佳答案
你似乎想要这样的东西:
select group,
max(case when data1 = 1 and data2 = 0 and data3 = 0 then key end) as data1,
max(case when data1 = 1 and data2 = 1 and data3 = 0 then key end) as data12,
max(case when data1 = 1 and data2 = 0 and data3 = 1 then key end) as data13,
max(case when data1 = 1 and data2 = 1 and data3 = 1 then key end) as data123
from #DataGroups dg
group by group
关于sql - 需要一些帮助来解决 SQL 分组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53414559/