如何在需要按一个键列分组的 3 个表中加入和求和值

Posted

技术标签:

【中文标题】如何在需要按一个键列分组的 3 个表中加入和求和值【英文标题】:How do i join and sum values in 3 tables where i need to group by one key column 【发布时间】:2019-03-28 12:06:37 【问题描述】:

我正在尝试加入 3 个表(表 A、表 B、表 C)都有 3 个字段(发票、产品类、值)。表 A 和表 B 在产品类字段中没有值,表 C 在值字段中没有值。所有表都有共同的值 Invoice 但不同的 ProductClass,结果应根据 invoices 和 ProductClass 求和值

create table tableA (
    Invoice varchar(100),
    ProductClass varchar(100),
    Value int
)
create table tableB (
    Invoice varchar(100),
    ProductClass varchar(100),
    Value int
)
create table tableC (
    Invoice varchar(100),
    ProductClass varchar(100),
    Value int
)

insert into tableA
values
('001','',10),
('002','',20),
('003','',30),
('004','',40)


insert into tableB
values
('001','',20),
('002','',30),
('003','',40),
('004','',50)


insert into tableC
values
('001','aaa',null),
('002','aab',null),
('003','aac',null),
('004','aad',null)



select Invoice,ProductClass,sum(Value)
from(
    select * from tableA
    union
    select * from tableB
    union
    select * from tableC
)tableD
group by Invoice,ProductClass

我希望结果会返回

Invoice - 001,002,003,004
ProductClass - aaa,aab,aac,aad
Value - 30,50,70,90

【问题讨论】:

【参考方案1】:

如果ProductClass 的值类似于blanknulls,您可以使用max()

select Invoice, max(ProductClass) as ProductClass, sum(Value) as Value
from(select * from tableA
     union
     select * from tableB
     union
     select * from tableC
    )tableD
group by Invoice;

【讨论】:

ProductClass 没有空白或空值检查我发布的示例代码上的 tableC @Ronald 。 .是的 tableC 没有 nullblank 但前两个表有这个。因此,如果您在 GROUP BY 中使用此列,它将被视为单独的组,即 (blank)。因此,为此,您的结果会很好。如果您想要单个组,请在ProductClass 中使用max()

以上是关于如何在需要按一个键列分组的 3 个表中加入和求和值的主要内容,如果未能解决你的问题,请参考以下文章

在 Hadoop Pig 中加入和分组

在 SQL Server 表中加入和分组后转置行

如何在 XSLT 中对值进行分组和求和

同时从四个表中获取按日期分组的聚合值

如何在golang中按多个值分组并对多个值求和

按分组列求和值