我正在尝试从数据库表中计算文档的不同状态。
假设表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行,而输出应该只有一行,所有状态都是。
答案 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 |
+-------+------+------+---------+---------+---------+--------+