SQL:按条件对同一列进行计数和分组
将列1视为Id。列2可以有3个固定值:A、B或C。例如: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
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。在这种情况下,两个聚合函数的结果相同