【问题标题】:Multiple joins with group by (Sum)与 group by (Sum) 的多个联接
【发布时间】:2021-04-22 09:34:29
【问题描述】:
当我使用多个 JOIN 时,我希望得到连接表中某些列的总和。
SELECT
A.*,
SUM(C.purchase_price) AS purcchase_total,
SUM(D.sales_price) AS sales_total,
B.user_name
FROM
PROJECT AS A
LEFT JOIN
USER AS B ON A.user_idx = B.user_idx
LEFT JOIN
PURCHASE AS C ON A.project_idx = C.project_idx
LEFT JOIN
SALES AS D ON A.project_idx = D.project_idx
GROUP BY
????
【问题讨论】:
标签:
sql
sql-server
join
sum
【解决方案1】:
您需要按如下方式使用子查询:
SELECT A.project_idx,
a.project_name,
A.project_category,
sum(C.purchase_price) AS purcchase_total,
sum(D.sales_price) as sales_total,
B.user_name
FROM PROJECT AS A
LEFT JOIN USER AS B ON A.user_idx = B.user_idx
LEFT JOIN (select project_idx, sum(purchase_price) as purchase_price
from PURCHASE group by project_idx ) AS C ON A.project_idx = C.project_idx
LEFT JOIN (select project_idx, sum(sale_price) as sale_price
from SALES group by project_idx) AS D ON A.project_idx = D.project_idx
我不确定,但您可以将project 的inner join 与user 一起使用,而不是left join。
【解决方案2】:
SELECT A.project_idx,
a.project_name,
A.project_category,
purcchase_total,
sales_total,
B.user_name
FROM PROJECT AS A
LEFT JOIN USER AS B ON A.user_idx = B.user_idx
LEFT JOIN (select project_idx, sum(purchase_price) as purchase_total
from PURCHASE group by project_idx ) AS C ON A.project_idx = C.project_idx
LEFT JOIN (select project_idx, sum(sale_price) as sale_total
from SALES group by project_idx) AS D ON A.project_idx = D.project_idx
这在 MS-SQL Server 上工作正常。
感谢大力水手
【解决方案3】:
您正在尝试聚合两个不相关的维度,这会导致所有计算失败。
相关子查询是一种替代方法:
SELECT p.*,
(SELECT SUM(pu.purchase_price)
FROM PURCHASE pu
WHERE p.project_idx = pu.project_idx
) as purchase_total,
(SELECT SUM(s.sales_price)
FROM SALES s
WHERE p.project_idx = s.project_idx
) as sales_total,
u.user_name
FROM PROJECT p LEFT JOIN
USER u
ON p.user_idx = u.user_idx ;
请注意,这使用了有意义的表别名,因此查询更易于阅读。任意字母实际上并不比使用整个表名更好(甚至可能更糟)。
相关子查询也避免了外部聚合——让您从第一个表中选择所有列,这正是您想要的。如果使用正确的索引,它们通常也有更好的性能。