SQL查询以统计每个不同值的出现

时间:2019-03-05 13:51:21

标签: sql sql-server pivot-table

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

我想为每个 userid 输出一个摘要行,并计算每个不同的 value 在输入中出现的次数。也就是说,摘要行包含以下列: 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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

解决方案

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

假设

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

注意

您说输入中的[值]列可以是5个不同值之一。我的解决方案基于该“要求”。它为每个不同的值包括一行代码。但是,如果不同值的数量可以随时间增长或不受限制,则将需要使用动态SQL的另一种方法。