sql - 如何使用聚合函数进行 GROUP BY CASE
问题描述
我试图根据一行显示的 a.stat 值来获取 a.clmNo 的计数。我目前正在返回 3 行,因为我在 3 个不同的 a.stat 值上有 5 个 a.clmNo 计数,这是有道理的,因为我按 s.stat 分组。如何更改我的查询,以便不必按 s.stat 分组,而是在一行上返回结果?
当前结果:
+-------------+--------------+-----------------+-----------+---------------+
| pend_claims | assnd_claims | qa_ready_claims | qa_claims | closed_claims |
+-------------+--------------+-----------------+-----------+---------------+
| 0 | 3 | 0 | 0 | 0 |
+-------------+--------------+-----------------+-----------+---------------+
| 0 | 0 | 0 | 1 | 0 |
+-------------+--------------+-----------------+-----------+---------------+
| 1 | 0 | 0 | 0 | 0 |
+-------------+--------------+-----------------+-----------+---------------+
期望的结果:
+------------+--------------+-----------------+-----------+--------------+
|pend_claims | assnd_claims | qa_ready_claims | qa_claims | closed_claims|
+------------+--------------+-----------------+-----------+--------------+
| 1 | 3 | 0 | 1 | 0 |
+------------+--------------+-----------------+-----------+--------------+
当前查询:
SELECT ISNULL(case when s.stat = 'Pending Assignment' then count(a.clmNo) end,0) as pend_claims,
ISNULL(case when s.stat = 'Assigned' then count(a.clmNo) end,0) as assnd_claims,
ISNULL(case when s.stat = 'QA Ready' then count(a.clmNo) end,0) as qa_ready_claims,
ISNULL(case when s.stat = 'In QA' then count(a.clmNo) end,0) as qa_claims,
ISNULL(case when s.stat = 'Closed' then count(a.clmNo) end,0) as closed_claims
FROM assnmts a
inner join assnmtStats astats
on a.assnmtIdPk = astats.assnmtIdFk
inner join stats s
on astats.aStatId = s.statIdPk
inner join repAssnmts ra
on a.assnmtIdPk = ra.assnmtIdFk
inner join aspnetusers anu
on ra.repId = anu.Id
inner join clients c
on a.clientIdFk = c.clientIdPk
inner join carrs
on a.carrierId = carrs.carrIdPk
inner join (SELECT a2.assnmtIdPk, MAX(astats2.asCrtdDt) as MaxDate
FROM assnmts a2
INNER JOIN assnmtStats astats2
on a2.assnmtIdPk = astats2.assnmtIdFk
GROUP BY a2.assnmtIdPk
) mdt
on a.assnmtIdPk = mdt.assnmtIdPk
and astats.asCrtdDt = mdt.MaxDate
inner join (select a3.assnmtIdPk, MAX(ra2.raCrtdDt) as MaxRepDate
from assnmts a3
inner join repAssnmts ra2
on a3.assnmtIdPk = ra2.assnmtIdFk
group by a3.assnmtIdPk
) mrepdt
on a.assnmtIdPk = mrepdt.assnmtIdPk
and ra.raCrtdDt = mrepdt.MaxRepDate
group by s.stat
解决方案
您需要条件聚合。删除GROUP BY
并改写SELECT
:
SELECT SUM(case when s.stat = 'Pending Assignment' then 1 else 0 end) as pend_claims,
SUM(case when s.stat = 'Assigned' then 1 else 0 end) as assnd_claims,
SUM(case when s.stat = 'QA Ready' then 1 else 0 end) as qa_ready_claims,
SUM(case when s.stat = 'In QA' then 1 else 0 end) as qa_claims,
SUM(case when s.stat = 'Closed' then 1 else 0 end) as closed_claims
推荐阅读
- javascript - 如何使用文本填充滚动来制作这样的滚动
- c# - 无法将 JSON 反序列化为对象
- python - Numpy:非相邻值的差异
- django - Django 数据表.net
- laravel - laravel eloquent中如何限制children的属性记录
- javascript - 如何更改html的输入法
- python - 合并两个 pandas 系列,删除 na 值
- javascript - 通过java更新photoshop中的链接文件
- azure - Az MySql 到 Az SQL Server - Data Lake Gen2
- scheme - 为什么应用映射和表达式列表只返回一个布尔值?