SQL:按条件对同一列进行计数和分组

SQL:按条件对同一列进行计数和分组,sql,sql-server,database,group-by,ssms,Sql,Sql Server,Database,Group By,Ssms,将列1视为Id。列2可以有3个固定值:A、B或C。例如: COL 1 COL 2 1 A 1 B 1 B 2 C 2 A 2 C 2 B 然后,输出应该是每个id的A、B和C的计数 COL 1 A count B count C count 1 1 2 0 2 1

将列1视为Id。列2可以有3个固定值:A、B或C。例如:

COL 1        COL 2
1            A
1            B
1            B
2            C
2            A
2            C
2            B
然后,输出应该是每个id的A、B和C的计数

COL 1    A count  B count  C count
1        1        2        0
2        1        1        2
枢轴操作员将完成这项工作

select  *
from    tbl t
        pivot
        (
            count(col2)
            for col2 in ([A], [B], [C])
        ) p
枢轴操作员将完成这项工作

select  *
from    tbl t
        pivot
        (
            count(col2)
            for col2 in ([A], [B], [C])
        ) p
您可以在以下情况下使用case

with t1 as
(
select id,col2,count(*) as cnt from t
group by id,col2
) select id, max(case when col2='A' then  cnt end) A_count
         max(case when col2='B' then  cnt end) B_count,
         max(case when col2='C' then  cnt end) C_count from t1
         group by id
您可以在以下情况下使用case

with t1 as
(
select id,col2,count(*) as cnt from t
group by id,col2
) select id, max(case when col2='A' then  cnt end) A_count
         max(case when col2='B' then  cnt end) B_count,
         max(case when col2='C' then  cnt end) C_count from t1
         group by id
试试这个

SELECT [Col 1],
       COUNT(CASE WHEN [COL 2]='A' THEN 1  ELSE 0 END) [A COUNT],
       COUNT(CASE WHEN [COL 2]='B' THEN 1  ELSE 0 END) [B COUNT],
       COUNT(CASE WHEN [COL 2]='C' THEN 1  ELSE 0 END) [C COUNT]
FROM TableName
GROUP BY [Col 1]
试试这个

SELECT [Col 1],
       COUNT(CASE WHEN [COL 2]='A' THEN 1  ELSE 0 END) [A COUNT],
       COUNT(CASE WHEN [COL 2]='B' THEN 1  ELSE 0 END) [B COUNT],
       COUNT(CASE WHEN [COL 2]='C' THEN 1  ELSE 0 END) [C COUNT]
FROM TableName
GROUP BY [Col 1]

您可以尝试使用pivot

SELECT col1 ,   
[A], [B], [C]
FROM  
(SELECT col1, col2
    FROM tablename) AS SourceTable  
PIVOT  
(  
sum(col2)  
FOR col2 IN ([A], [B], [C])  
) AS PivotTable

您可以尝试使用pivot

SELECT col1 ,   
[A], [B], [C]
FROM  
(SELECT col1, col2
    FROM tablename) AS SourceTable  
PIVOT  
(  
sum(col2)  
FOR col2 IN ([A], [B], [C])  
) AS PivotTable
我推荐PIVOT。请参阅以下演示:

SELECT * INTO #t FROM (
    VALUES 
    (1, 'A'),
    (1, 'B'),
    (1, 'B'),
    (2, 'C'),
    (2, 'A'),
    (2, 'C'),
    (2, 'B')) T([COL 1],[COL 2])

SELECT [COL 1], A [A count], B [B count], C [C count]
FROM #t
PIVOT (COUNT([COL 2]) FOR [COL 2] IN (A,B,C)) P
结果

我推荐PIVOT。请参阅以下演示:

SELECT * INTO #t FROM (
    VALUES 
    (1, 'A'),
    (1, 'B'),
    (1, 'B'),
    (2, 'C'),
    (2, 'A'),
    (2, 'C'),
    (2, 'B')) T([COL 1],[COL 2])

SELECT [COL 1], A [A count], B [B count], C [C count]
FROM #t
PIVOT (COUNT([COL 2]) FOR [COL 2] IN (A,B,C)) P
结果


您甚至可以通过执行动态SQL查询来实现这一点。这将有助于避免显式编写代码

质疑


您甚至可以通过执行动态SQL查询来实现这一点。这将有助于避免显式编写代码

质疑


我将执行条件聚合而不是透视:


我将执行条件聚合而不是透视:


应该是总和而不是计数。或者,如果使用COUNT,则删除ELSE 0。在这种情况下,两个聚合函数都将导致sameShould为SUM而不是COUNT。或者,如果使用count,则删除ELSE 0。在这种情况下,两个聚合函数的结果相同