Объединить два запроса, которые сгруппированы по одному столбцу из одинаковых таблиц, но разные параметры для объединения - PullRequest
0 голосов
/ 24 января 2020

У меня есть 3 таблицы с предметами, владельцами и статусами, и мне нужно показать количество предметов, которые были проданы / выброшены сгруппированы по каждому владельцу за год, указанный в качестве параметра.

Я могу получить имя владельца и проданный счет как один запрос, а имя владельца и сбросить счет как второй запрос, но есть ли способ структурировать так, чтобы имя владельца, проданный счет и скидка приходились в одном запросе?

declare @QueryYear integer = 2020
    --SOLD
    select O1.pk_owner_id,count(P1.pk_Property_ID) as [SaleCount]
    from
        Item P1, Owner O1, Status S1
    WHERE    
        (C1.fkl_owner_ID = O1.pk_owner_ID and C1.fkl_item_ID=P1.pk_item_ID and O1.isactive=1 and year(P1.dtList_Date)=@QueryYear and P1.fkl_status_ID=1)
    group by 
        O1.pk_owner_id

    --DISCARD
    select O2.pk_owner_id,count(P2.pk_item_ID) as [DiscardCount]
    from
        item P2, owner O2, status C2
    WHERE    
        (C2.fkl_Owner_ID = O2.pk_owner_ID and C2.fkl_item_ID=P2.pk_item_ID and O2.isactive=1 and year(P2.dtList_Date)=@QueryYear and P2.fkl_item_status_ID=2)
    group by 
        O2.pk_owner_id

Я использовал Union, и он дает ответ только в 2 столбцах.

1 Ответ

1 голос
/ 24 января 2020

Переместите фильтр состояния в операторы case в предложении select.

select      o.pk_owner_id,
            SaleCount = count(case when i.fkl_status_ID = 1 then 1 end),
            DiscardCount = count(case when i.fkl_item_status_ID = 2 then 1 end)
from        Status s 
join        Item i on s.fkl_item_ID = i.pk_item_ID
join        Owner o on s.fkl_owner_ID = o.pk_owner_ID                   
where       o.isactive = 1 
and         year(i.dtList_Date) = @QueryYear 
group by    o.pk_owner_id

Кроме того, используйте реляционные операторы для связи express между таблицами, не используйте предложение where. В этом случае, поскольку характер отношения является «горизонтальным» в том смысле, что каждая строка в одной таблице соответствует каждой строке в другой таблице, вы ищете (внутренний) join.

Наконец, если у вас больше типов состояний, чем «1» и «2», вы можете добавить еще одно условие к вашему присоединению status с помощью item или добавить его в свой оператор where , А именно, вы можете сделать что-то вроде:

and i.fkl_status_ID in (1,2)

Но я заметил, что столбцы status_id имеют разные имена для SaleCount и DiscardCount. Так что, если это не ошибка, вам нужно сделать or версию в скобках. Но главное в том, что ваш запрос будет более эффективным, если процессор знает, что игнорирует состояния, отличные от «1» или «2».

...