【问题标题】:SUM over distinct rows with multiple joins对具有多个连接的不同行求和
【发布时间】:2021-10-15 10:13:04
【问题描述】:

我需要创建一个查询,根据资源名称、人员姓名和人员的 uf 代码(无论人员、资源、uf 字段是否为已满。

到目前为止我有这个咨询。

Create table Ordered(
    oid int,        
    movement date,     
    pid int,        
    rid int,          
    amount double,     
    unitary double,
    total double, 
    Primary key (OID),
    Constraint fk_PID Foreign key (PID) references People (PID),
    Constraint fk_RID Foreign key (RID) references Resource (RID)
    );

Create table Resource(
    rid int,          
    code Varchar(25),     
    name Varchar(150),        
    Primary key (RID)
    );
    
Create table People(
    pid int,          
    code varchar(25),     
    name varchar(150),        
    FU int,        
    Primary key (PID),
    Constraint fk_FID Foreign key (FID) references FU (FID)
    );
    
Create table FU(
    fid int,          
    code varchar(25),     
    name varchar(150),
    Primary key (Fid)
    );

select r.name,p.name,f.code,sum(o.total) from Ordered o 
    right join resource r on o.rid = r.rid right join 
    People p on o.pid = p.pid 
    right join fu f on p.fid = f.fid where o.movement >= '2006-01-01' and o.movement <= '2006-01-31' group by r.name,p.name,f.code

我的问题是当资源或人员为空时查询没有列出

使用以下查询 (http://www.sqlfiddle.com/#!9/c0f4fe/4)

【问题讨论】:

  • 不清楚你到底想要什么结果。

标签: sql postgresql join sum aggregate


【解决方案1】:

我不是 100% 确定你想要什么。但是,如果您想列出所有人,即使是没有订单的人,请以people 开头并使用left join:

select r.name, p.name, f.code,sum(o.total)
from People p left join
     Ordered o
     on o.pid = p.pid and
        o.movement >= '2006-01-01' and o.movement <= '2006-01-31' left join
     resource r
     on o.rid = r.rid left join
     fu f
     on p.fid = f.fid 
group by r.name,p.name,f.code

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多