2012-02-07 20 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