与分组联合
Union with Group By
查看了其他问题,尝试了不同的方法,但仍然 return 不止一行。
2 tables 上的 Union 问题,group by 子句。应该只有一行 returned,按 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 行 returned,每个 table 一行。我需要将它们组合在一起,因此它只有 returns 1 行,基于 servicedID。
我正在尝试 return 的数据来自以下 tables..
产品Table
productID serviceName
-------------------------
1 Gold Service
2 Silver Service
3 Bronze Service
赋值Table
ApplicantID serviceID status
-------------------------------------
1 1 0
2 1 0
3 1 1
4 2 0
5 1 1
遗产 Table
ApplicantID serviceID status
-------------------------------------
1 1 0
2 1 0
3 1 0
4 2 0
5 1 1
我试图获得的结果是每个 serviceID 一行,以显示 Legacies 和 Assigns 中有多少申请人使用此服务 table,类似于:-
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
遗产和分配 tables。
尚未测试
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
以下为编辑前
很难判断,因为您没有 post 足够的信息(没有样本数据,没有 table 结构,没有预期的输出)。但我认为您可以将它们全部组合成 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
查看了其他问题,尝试了不同的方法,但仍然 return 不止一行。
2 tables 上的 Union 问题,group by 子句。应该只有一行 returned,按 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 行 returned,每个 table 一行。我需要将它们组合在一起,因此它只有 returns 1 行,基于 servicedID。
我正在尝试 return 的数据来自以下 tables..
产品Table
productID serviceName
-------------------------
1 Gold Service
2 Silver Service
3 Bronze Service
赋值Table
ApplicantID serviceID status
-------------------------------------
1 1 0
2 1 0
3 1 1
4 2 0
5 1 1
遗产 Table
ApplicantID serviceID status
-------------------------------------
1 1 0
2 1 0
3 1 0
4 2 0
5 1 1
我试图获得的结果是每个 serviceID 一行,以显示 Legacies 和 Assigns 中有多少申请人使用此服务 table,类似于:-
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
遗产和分配 tables。
尚未测试
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
以下为编辑前
很难判断,因为您没有 post 足够的信息(没有样本数据,没有 table 结构,没有预期的输出)。但我认为您可以将它们全部组合成 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