如何对连接表中的数据进行透视和求和

问题描述 投票:0回答:3

我有两个表A和B,如下所示。 表A

组件 金额
ss-001 PF 1500
ss-001 PT 200
ss-002 PF 1450
ss-002 PT 150
ss-003 PF 1550
ss-003 PT 300

表B

员工 网络支付
emp-001 ss-001 18500
emp-002 ss-002 17000
emp-003 ss-003 16600

如何通过查询得到下面的表格?

员工 PF+PT 网络支付
emp-001 1700 18500
emp-002 1600 17000
emp-003 1850 16600

我能够在两个不同的列中获得 PF 和 PT,但无法求和。

我尝试了

SUM()
CONCAT()

mysql group-by sum pivot aggregate-functions
3个回答
1
投票

这可以使用条件聚合来完成,如下所示:

select emp, sum(case when component = 'PF' then amount end) 
            + sum(case when component = 'PT' then amount end) as 'PF + PT', 
            max(netpay) as netpay
from tableA a
inner join tableB b on a.slip = b.slip
group by emp;

结果:

emp     PF + PT netpay
emp-001 1700    18500
emp-002 1600    17000
emp-003 1850    16600

演示在这里


1
投票

一个简单的相关查询就足够了:

select emp, (
    select sum(amount)
    from table_a
    where table_a.slip = table_b.slip
) as "PF + PT", netpay
from table_b

0
投票

我不知道我是否低估了你的最小例子,但我的观察是,

b
表是“一个”,而
a
表是“多”。我可能会获取
FROM b
,然后仅获取
JOIN a
上的
slip
,并且仅获取包含要求和的分量值的行。这样,您就不需要在
SUM()
函数内部对返回的每一行显式执行比较——因为没有“脂肪”可以修剪。

SQL:(DBFiddle

SELECT b.emp,
       SUM(a.amount) `PF + PT`, 
       b.netpay
FROM tableB b
JOIN tableA a ON b.slip = a.slip AND a.component IN ('PF', 'PT')
GROUP BY b.emp, b.netpay

我不是 SQL 专家,但我认为这比在 SELECT 子句中为每一行运行子查询更理想。我也不能自信地说,按两列分组以避免选择中的

MAX()
更快,还是只按一列分组并调用
MAX()

© www.soinside.com 2019 - 2024. All rights reserved.