我有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列中给出答案。
答案 0 :(得分:1)
将状态过滤器移至select子句中的case语句。
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
此外,使用关系运算符来表示表之间的关系,不要使用where
子句。在这种情况下,由于关系的性质是“水平的”,因为一个表中的每一行都与另一表中的每一行匹配,因此您正在寻找(内部)join
。
最后,如果状态类型多于'1'和'2',则可以为status
与item
的连接添加其他条件,或将其放入{{1 }}语句。即,您可以执行以下操作:
where
但是我注意到status_id列的SaleCount和DiscardCount具有不同的名称。因此,如果这不是错误,则需要制作一个带括号的and i.fkl_status_ID in (1,2)
版本。但主要要点是,如果处理器知道忽略不是“ 1”或“ 2”的状态,则查询将更有效。