我有 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
我使用了一个联盟,它只在 2 列中给出了答案。
将状态过滤器移至 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
子句。在这种情况下,因为关系的性质是“水平的”,因为一个表中的每一行都与另一个表中的每一行相匹配,所以您正在寻找一个 (inner) join
。
最后,如果您的状态类型比 '1' 和 '2' 多,那么您可以在status
with的连接中添加另一个条件item
,或将其放入您的where
语句中。也就是说,您可以执行以下操作:
and i.fkl_status_ID in (1,2)
但是我注意到 status_id 列对于 SaleCount 和 DiscardCount 有不同的名称。所以如果这不是错误,你需要做一个带括号的or
版本。但主要的一点是,如果处理器知道忽略不是“1”或“2”的状态,您的查询将更有效率。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句