我有两个表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()
。
这可以使用条件聚合来完成,如下所示:
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
一个简单的相关查询就足够了:
select emp, (
select sum(amount)
from table_a
where table_a.slip = table_b.slip
) as "PF + PT", netpay
from table_b
我不知道我是否低估了你的最小例子,但我的观察是,
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()
。