Союз с Группой К - PullRequest
       27

Союз с Группой К

0 голосов
/ 24 апреля 2020

Посмотрел другие вопросы, пробовал разные вещи, но все равно возвращал более одной строки.

Проблема с объединением на 2 таблицы, с предложением group by. Должна быть возвращена только одна строка, сгруппированная по идентификатору службы.

 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

Таблица Legacies

ApplicantID    serviceID    status
-------------------------------------  
     1             1           0
     2             1           0
     3             1           0
     4             2           0
     5             1           1

Результат, который я пытаюсь получить, - одна строка для идентификатора службы, показывающая, сколько кандидатов на это служба в таблице 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»

1 Ответ

1 голос
/ 24 апреля 2020

Основываясь на дополнительной информации, я думаю, что вы можете просто 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
...