首页 > 解决方案 > SQL 查询以计算每个不同值的出现次数

问题描述

我有一个包含 2 个字段的表:useridvalue。可以有多行具有相同的userid列可以是 5 个不同的值之一。

我想为每个userid输出一个摘要行,计算每个不同出现在输入中的次数。也就是说,摘要行具有以下列:userid值 1计数、值 2计数、值 3计数、值 4计数和值 5 的计数

例子

1,4

1,3

2,1

3,5

4,1

5,2

输出将是

1,0,0,1,1,0

2,1,0,0,0,0

3,0,0,0,0,5

4,1,0,0,0,0

5,0,1,0,0,0

有什么建议么?

标签: sqlsql-serverpivot-table

解决方案


解决方案

select userid, 
    sum(case value when 1 then [occurs] else 0 end) as countOf1,
    sum(case value when 2 then [occurs] else 0 end) as countOf2,
    sum(case value when 3 then [occurs] else 0 end) as countOf3,
    sum(case value when 4 then [occurs] else 0 end) as countOf4,
    sum(case value when 5 then [occurs] else 0 end) as countOf5
    from
(
    select userid, [value], count(*) as [occurs]
    from inputTable
    group by userid, [value]
) t
group by userid
order by userid

假设

我从您的问题中收集到相同的输入行值可能会出现多次,尽管您的示例数据并未显示这种可能性。但是,如果每个不同的行只能出现一次,则可以使用更简单/更短的解决方案。

警告

您声明输入中的 [value] 列可以是 5 个不同的值之一。我的解决方案就是基于这个“要求”。它为每个不同的值包含一行代码。但是,如果不同值的数量可以随时间增长或者是无限的,则需要使用动态 SQL 的不同方法。


推荐阅读