我有两个类似于这个例子的表(为了清晰起见进行了简化):
- 家长:*
| id | name | amount | year |
----------------------------------------
| 101 | Henry | 300 | 2020 |
----------------------------------------
| 102 | Carol | 100 | 2020 |
----------------------------------------
| 103 | Tom | 900 | 2020 |
----------------------------------------
字符串
- 孩子:*
| id | parent_id | department |
--------------------------------------
| 1 | 101 | finance |
--------------------------------------
| 2 | 101 | hr |
--------------------------------------
| 3 | 101 | it |
--------------------------------------
| 4 | 102 | support |
--------------------------------------
型
我试图通过以下脚本连接两个表并获取amount字段的总和值,但由于记录101重复了3次,因此总和将是1900而不是1300:
select
sum(p.amount),
count(c)
from parent p
left join child c on c.parent_id = p.id
where p.year = 2020
型
当我使用下面的查询时,它可以工作,但它给出的count of child为2而不是4,因为它根据其父记录对子记录进行了分组:
SELECT
SUM(p.amount),
COUNT(c)
FROM parent p
LEFT JOIN (
SELECT parent_id
FROM child
GROUP BY parent_id
) c ON c.parent_id = p.id
WHERE p.year = 2020;
型
那么,如何解决这个问题呢?
3条答案
按热度按时间hmtdttj41#
此查询联接表,计算每个父项的子记录计数,然后将父项数量和子项计数相加。
字符串
而您的查询在SELECT子句中使用子查询,这可能效率较低。此外,它不会显式连接表,这可能会导致混淆子计数与父记录的关系。
91zkwejq2#
如果你的目标是 * 计算一个总数和查尔兹的总数 *,你必须首先计算孩子的数量,然后在第二步中加入。
此查询计算子计数并返回详细数据
字符串
添加聚合将提供请求的结果
型
gj3fmq9x3#
我使用了以下方法,并通过提供父表中的正确金额和子表中的计数来修复这个问题:
字符串
注意:由于查询将被转换为HQL,我不能像@SenthilPNathan的答案那样使用
JOIN
with子句。