连接来自相同表但具有不同参数的按同一列分组的两个查询以进行连接

时间:2020-01-23 23:03:52

标签: sql-server join group-by

我有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 个答案:

答案 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',则可以为statusitem的连接添加其他条件,或将其放入{{1 }}语句。即,您可以执行以下操作:

where

但是我注意到status_id列的SaleCount和DiscardCount具有不同的名称。因此,如果这不是错误,则需要制作一个带括号的and i.fkl_status_ID in (1,2) 版本。但主要要点是,如果处理器知道忽略不是“ 1”或“ 2”的状态,则查询将更有效。

相关问题