计算SQL中多个表的记录

时间:2017-08-09 12:09:13

标签: sql sql-server aggregate-functions

我正在尝试从数据库表中计算文档的不同状态。

假设表1有:

select docid, year, type, statusid
from table1
where docid in (1, 2) and year = '2016'

返回:

docid year type statusid
------------------------
1     2016  pdf   231
1     2016  pdf   231
1     2016  pdf   231
1     2016  pdf   232
1     2016  pdf   232
1     2016  pdf   235
1     2016  pdf   235

但我只需返回一条记录,如

docid  year  type   granted  revoked deleted others
----------------------------------------------------
1      2016   pdf    3        2       2        0

而状态位于不同的表格中

表2

statusid     status       masterid
----------------------------------
231          granted      51
232          revoked      51
235          deleted      51
236          others       51

我尝试的是:

select 
    docid, year, type,statusid 
    case 
       when statusid = 231 
          then count(statusid) 
       else 0 
    as granted,
    case 
       when statusid = 232 
          then count(statusid) 
       else 0 as revoked,
    case 
       when statusid = 235 
          then count(statusid) 
       else 0 as deleted,
    case 
       when statusid = 236 
          then count(statusid) 
       else 0 as others
from 
    table1
where 
    docid in (1, 2) and year = '2016'
group by 
    docid, year, type, statusid

但这会返回3行,而输出应该只有一行,所有状态都是。

2 个答案:

答案 0 :(得分:3)

你很亲密。 case需要作为聚合函数的参数,并且您不希望statusid中有group by

select docid, year, type,
       sum(case when statusid = 231 then 1 else 0 end) as granted,
       sum(case when statusid = 232 then 1 else 0 end) as revoked,
       sum(case when statusid = 235 then 1 else 0 end) as deleted,
       sum(case when statusid = 236 then 1 else 0 end) as others
from table1
where docid in (1,2) and year='2016'
group by docid, year, type 

答案 1 :(得分:1)

您可以使用与以下相同的方式:

Select * from (
    Select docid, [year], [type], [status] from table1 d 
    Join table2 dt on d.statusid = dt.statusid
) a
Pivot (count([status]) for [status] in ([granted],[revoked],[deleted],[others])) p

输出如下:

+-------+------+------+---------+---------+---------+--------+
| docid | year | type | granted | revoked | deleted | others |
+-------+------+------+---------+---------+---------+--------+
|     1 | 2016 | pdf  |       3 |       2 |       2 |      0 |
+-------+------+------+---------+---------+---------+--------+