Переместите фильтр состояния в операторы 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».