聚合来自多列的数据(类似于PIVOT表)

时间:2012-08-18 02:20:10

标签: sql-server pivot-table

我有一个包含以下数据的表(本例简称):

    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语句,它似乎变得非常复杂(我最终不得不添加更多,因为上面的例子是我需要执行此操作的列数的一个非常基本的例子。

我错过了什么?

谢谢。

2 个答案:

答案 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


SQL Fiddle Demo

相关问题