【发布时间】:2020-02-13 08:55:46
【问题描述】:
左表:
+------+---------+--------+
| Name | Surname | Salary |
+------+---------+--------+
| Foo | Bar | 100 |
| Foo | Kar | 300 |
| Fo | Ba | 35 |
+------+---------+--------+
右表:
+------+-------+
| Name | Bonus |
+------+-------+
| Foo | 10 |
| Foo | 20 |
| Foo | 50 |
| Fo | 10 |
| Fo | 100 |
| F | 1000 |
+------+-------+
期望的输出:
+------+---------+--------+-------+
| Name | Surname | Salary | Bonus |
+------+---------+--------+-------+
| Foo | Bar | 100 | 80 |
| Foo | Kar | 300 | 0 |
| Fo | Ba | 35 | 110 |
+------+---------+--------+-------+
我得到的最接近的是:
SELECT
a.Name,
Surname,
sum(Salary),
sum(Bonus)
FROM (SELECT
Name,
Surname,
sum(Salary) as Salary
FROM input
GROUP BY 1,2) a LEFT JOIN (SELECT Name,
SUM(Bonus) as Bonus
FROM input2
GROUP BY 1) b
ON a.Name = b.Name
GROUP BY 1,2;
给出:
+------+---------+-------------+------------+
| Name | Surname | sum(Salary) | sum(Bonus) |
+------+---------+-------------+------------+
| Fo | Ba | 35 | 110 |
| Foo | Bar | 100 | 80 |
| Foo | Kar | 300 | 80 |
+------+---------+-------------+------------+
我不知道如何摆脱 Bonus 重复。对我来说,理想的解决方案是在“期望的输出”中指定,即仅将 Bonus 添加到一个 Name,对于具有相同 Name 的其他记录,添加 0。
【问题讨论】:
-
对于初学者,您不需要在这里同时加入
name和surname吗? -
右表没有姓氏(但我同意它的外键设计很糟糕)
-
这些表只是举例,我需要它的真实表要复杂得多。 @JacobH 是的,问题是我只需要名字就可以加入。
标签: sql postgresql duplicates left-join