我有一个包含以下数据的表(本例简称):
C1 C2 C3 C4
=========================
1 0 1 1 0
2 1 1 0 1
3 1 0 1 1
4 1 1 1 1
5 0 0 1 1
6 0 0 0 1
我想创建一个创建查询,它给出了以下结果:
C3 C4
=============
C1 2 3
C2 2 2
即,这四列的组合时:
C1 = 1 & C3 = 1
C1 = 1 & C4 = 1
C2 = 1 & C3 = 1
C2 = 1 & C4 = 1
我已经能够取得一些进展,但最终并不是我想要的。我设法做到这一点:http://sqlfiddle.com/#!3/7d3d4/2/0
但我无法弄清楚如何将我的查询格式化为上面所需的输出格式。我打算尝试使用PIVOT
表,但很快放弃了这个想法,因为一旦我需要添加第二个PIVOT
语句,它似乎变得非常复杂(我最终不得不添加更多,因为上面的例子是我需要执行此操作的列数的一个非常基本的例子。
我错过了什么?
谢谢。
答案 0 :(得分:1)
我认为这会为您提供所要求的结果集
SELECT COL1, C3, C4
FROM (
SELECT SUBSTRING(col,1,2) col1, SUBSTRING(col,3,2) col2, value
FROM (
SELECT SUM(c1*c3) as c1c3, SUM(c1*c4) as c1c4,
SUM(c2*c3) as c2c3, SUM(c2*c4) as c2c4
FROM t1
) t
UNPIVOT (value FOR col IN (c1c3, c1c4, c2c3, c2c4)) AS u
) data
PIVOT (SUM(value) FOR col2 IN ([c3], [c4])) pvt
我开始编写一个给出总数的查询,结果集看起来像这样
c1c3 c1c4 c2c3 c2c4
2 3 2 2
此时您可能只是使用此查询并将获得所需的结果
SELECT 'c1' AS col, c1c3 AS C3, c1c4 AS C4
UNION ALL
SELECT 'c2' AS col, c2c3 AS C3, c2c4 AS C4
第一个解决方案只是一个如何UNPIVOT然后PIVOT再次以你想要的方式订购列的例子
答案 1 :(得分:1)
试试这个:
SELECT 'C1',SUM(CASE WHEN C1=1 AND C3=1 THEN 1 END)AS C3,
SUM(CASE WHEN C1=1 AND C4=1 THEN 1 END)AS C4
FROM T1
UNION ALL
SELECT 'C2',SUM(CASE WHEN C2=1 AND C3=1 THEN 1 END)AS C3,
SUM(CASE WHEN C2=1 AND C4=1 THEN 1 END)AS C4
FROM T1