sql - 与 Group By 联合
问题描述
看了其他问题,尝试了不同的东西,但仍然返回不止一行。
2 个表上的 Union 问题,带有 group by 子句。应该只返回一行,按 serviceID 分组。
SELECT
serviceID,
serviceName,
FullCount,
WaitingCount,
InProgressCount
from (
select
a.serviceID,
serviceName,
count(applicantID) FullCount,
ISNULL(SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END),0) AS WaitingCount,
ISNULL(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END),0) AS InProgressCount
from Products s
left join Assigns a on a.serviceID = s.productID
WHERE s.clientID = @ClientID
group by serviceID, serviceName
UNION
select
s.serviceID,
p.serviceName,
count(s.ApplicantID) FullCount,
ISNULL(SUM(CASE WHEN s.status = 0 THEN 1 ELSE 0 END),0) AS WaitingCount,
ISNULL(SUM(CASE WHEN s.status = 1 THEN 1 ELSE 0 END),0) AS InProgressCount
from Legacies s
Left Join Products p on s.serviceID = p.productID
WHERE s.client = @CompanyName
group by serviceID, serviceName
) t
GROUP BY serviceID, serviceName
我总是从每个表中返回 2 行。我需要将它们组合在一起,因此它只返回 1 行,基于 servicedID。
我试图返回的数据来自下表..
产品表
productID serviceName
-------------------------
1 Gold Service
2 Silver Service
3 Bronze Service
分配表
ApplicantID serviceID status
-------------------------------------
1 1 0
2 1 0
3 1 1
4 2 0
5 1 1
遗产表
ApplicantID serviceID status
-------------------------------------
1 1 0
2 1 0
3 1 0
4 2 0
5 1 1
我试图得到的结果是每个 serviceID 一行,以显示 Legacies 和 Assigns 表中有多少申请人在使用此服务,例如:-
serviceID serviceName FullCount WaitingCount InProgressCount
----------------------------------------------------------------
1 Gold Service 8 5 3
2 Silver Service 2 2 0
3 Bronze Service 0 0 0
FullCount 是每个服务上的申请人总数,WaitingCount 是状态为“0”的服务上的申请人数,InProgressCount 是该服务上状态为“1”的申请人数
解决方案
根据其他信息,我认为您可以只union all
使用 Legacies 和 Assigns 表。
仍然未经测试
select serviceID, servicename, count(*) fullcount
,sum(case when status = 0 THEN 1 ELSE 0 END) AS WaitingCount
,SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS InProgressCount
from (
select ApplicantID, serviceID, status
from Assigns
WHERE clientID = @ClientID
union all
select ApplicantID, serviceID, status
from Legacies
WHERE clientID = @ClientID
) combined
left join Products P on P.productID = combined.serviceID
group by serviceID, servicename
以下是编辑前
很难说,因为您没有发布足够的信息(没有样本数据、没有表结构、没有预期的输出)。但我认为您可以将它们全部组合成 1 个查询:
未经测试,这在缺乏信息的情况下应该是显而易见的。
SELECT isnull(a.serviceID, L.serviceID) serviceID, p.serviceName
,count(*) FullCount, SUM(CASE WHEN isnull(a.status, L.status) = 0 THEN 1 ELSE 0 END) WaitingCount
,sum(CASE WHEN isnull(a.status, L.status) = 1 THEN 1 ELSE 0 END) InProgressCount
from Legacies L
full outer join Assigns a on a.serviceID = L.serviceID
right outer join Products P on P.productID = isnull(a.serviceID, L.serviceID)
where (P.clientID = @ClientID
or L.client = @CompanyName
)
group by isnull(a.serviceID, L.serviceID), p.serviceName
推荐阅读
- python - 使用足够的数据集找到两个变量之间的数学关系
- wordpress - 使用 authorize.net 进行自动付款
- python - 我怎样才能成功地使用装饰器功能来解决我的问题?
- image-processing - 使用 imagemagick 处理图像并嵌入网络时,我应该留下还是去除嵌入的颜色配置文件?
- reactjs - TypeError: (0, _react.default) 不是函数
- javascript - 我的 if 语句没有显示/隐藏元素,我不知道为什么
- c# - 客户端无法连接到 mqtt 代理并出现错误:远程证书被提供的拒绝
- c# - 在继承的 ViewComponent .net core 5.0 中覆盖 Invoke 方法
- blockchain - Solana - 如何获得外国账户的代币余额?
- typescript - 声明为联合类型的常量在导出时降级为字符串