与分组联合

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