简体   繁体   English

SQL Group By / Count:跨多个列计数相同的值吗?

[英]SQL Group By / Count: Count Same Values Across Multiple Columns?

I'm trying to figure out how to write a query that counts values across multiple columns, with the result table having a count in each column for every possible value of any column. 我试图弄清楚如何编写一个查询多个列中的值的查询,结果表在每个列中都对任何列的每个可能值都有一个计数。

Example: Say I have mytable 示例:说我有mytable

Source data table:

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

I want a query that counts a's and b's in each column, producing something like: 我想要一个查询,在每列中计算a和b,产生类似以下内容的结果:

Desired query output:

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

I know I can do this for a single column easily with a group by : 我知道我可以通过group by轻松地对单个列执行此操作:

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

But is it possible to do this for every column? 但是是否可以对每一列都执行此操作?

I'm using SQL Server 2008 (T-SQL). 我正在使用SQL Server 2008(T-SQL)。 Thanks in advance for any help! 在此先感谢您的帮助!

Maybe something like this: 也许是这样的:

First some test data: 首先是一些测试数据:

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'

Then a pivot like this: 然后是一个像这样的枢轴:

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 is more information about pivot and unpivot 是有关枢轴和非枢轴的更多信息

Probably not the most efficient but this works. 可能不是最有效的,但这可行。

    ;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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM