在同一个表上分组并包含所有数据,如名称

时间:2014-08-12 11:14:07

标签: sql sql-server sql-server-2008-r2

我的数据库中有以下表格和虚构记录。

id | name         | status | clientid 
1  | John Doe     | 4      | 200
2  | Jane Doe     | 2      | 400
3  | John Doe     | 4      | 200
4  | Mike Smith   | 4      | 300
5  | Mike Smith   | 2      | 300
6  | Jane Doe     | 4      | 400
7  | Jane Doe     | 4      | 400

我想要做的是检索所有记录,按clientid分组并显示一些状态 对于那些记录。例如,我想知道有多少状态clientid 400设置为状态2以及状态4中有多少状态。

所以我想要一个看起来像这样的输出:

id | name         | clientid | status_2 | status_4
1  | John Doe     | 200      | 0        | 2
2  | Mike Smith   | 300      | 1        | 1
3  | Jane Doe     | 400      | 1        | 2

但我无法弄清楚如何得到这个。当我做GROUP BY时,我无法显示他们的名字。当我做LEFT JOIN时,我会回到许多记录等。

我应该如何构建查询以获得如上所示的结果?

2 个答案:

答案 0 :(得分:3)

select name, 
       clientid, 
       sum(case when status = 2 then 1 end) as status_2,
       sum(case when status = 4 then 1 end) as status_4
from your_table
group by name,
         clientid

答案 1 :(得分:1)

简单的部分是条件聚合。如果你真的想要id增量,那么你可以使用dense_rank()

select dense_rank() over (order by min(id)) as id,
       name, clientid,
       sum(case when status = 2 then 1 else 0 end) as status_2,
       sum(case when status = 4 then 1 else 0 end) as status_4
from table t
group by name, clientid;