2012-02-07 22 views
1

我想弄清楚如何编写一个查询,跨越多个列的计数值,结果表在每列中的每个可能值为列的任何列都有一个计数。SQL组By/Count:跨多列计数相同的值?

示例:假设我有MYTABLE

Source data table: 

P1 P2 P3 
----------- 
a b a 
a a a 
b b b 
a b b 

我想计数A和B的每列中,产生类似的查询:

Desired query output: 

    P1 P2 P3 
    ------------- 
a | 3 1 2 
b | 1 3 2 

我知道我能做到这一点的单列容易与组通过

select P1, count(*) as mycounts 
from mytable 
group by P1 

但是是否可以这样做列?

我正在使用SQL Server 2008(T-SQL)。预先感谢任何帮助!

回答

5

也许是这样的:

首先是一些测试数据:

DECLARE @tbl TABLE(P1 VARCHAR,P2 VARCHAR,P3 VARCHAR) 

INSERT INTO @tbl 
SELECT 'a','b','a' UNION ALL 
SELECT 'a','a','a' UNION ALL 
SELECT 'b','b','b' UNION ALL 
SELECT 'a','b','b' 

然后枢这样的:

SELECT 
    * 
FROM 
(
    SELECT 'P1' AS P, P1 AS PValue,P1 AS test FROM @tbl 
    UNION ALL 
    SELECT 'P2',P2,P2 FROM @tbl 
    UNION ALL 
    SELECT 'P3',P3,P3 FROM @tbl 
) AS p 
PIVOT 
(
    COUNT(PValue) 
    FOR P IN ([P1],[P2],[P3]) 
) AS pvt 

Here约为透视和逆透视

更多信息
+0

谢谢,Arion!这很漂亮!现在来研究语法并学习这些函数的内涵:D – 2012-02-08 15:07:36

+0

然后你可以考虑接受答案。很高兴帮助:) ..我添加了一个像在MSDN页面的枢轴的答案。 – Arion 2012-02-08 15:12:10

+1

现在我已经学会了如何接受答案。哦,互联网教育学,我是如何崇拜你的。 – 2012-02-08 15:26:25

0

可能不是最有效的,但这个工程。

;WITH data 
AS 
(
    SELECT 'a' AS p1, 'b' AS p2, 'a' AS p3 
    UNION ALL 
    SELECT 'a', 'a','a' 
    UNION ALL 
    SELECT 'b','b','b' 
    UNION ALL 
    SELECT 'a','b','b' 
) 
SELECT 
    p_one.value AS header, 
    p1, 
    p2, 
    p3 
FROM (SELECT 
      p1 AS value, 
      count(*) AS p1 
     FROM data d 
     GROUP BY p1) p_one 
left JOIN (SELECT 
      p2 AS value, 
      count(*) AS p2 
      FROM data d 
      GROUP BY p2) p_two 
    ON p_two.value = p_one.value 
left JOIN (SELECT 
      p3 AS value, 
      count(*) AS p3 
      FROM data d 
      GROUP BY p3) p_three 
    ON p_two.value = p_three.value 
+0

cte很好,但是让下面的查询成为一个枢轴语句。 – 2012-02-08 00:02:28

+0

左连接也不会在这里工作。即。如果p1仅作为“a”,则p2和p3中的“b”将被忽略。 – 2012-02-08 04:30:39