【问题标题】: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

我不确定,但您可以将projectinner joinuser 一起使用,而不是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 ;
      

      请注意,这使用了有意义的表别名,因此查询更易于阅读。任意字母实际上并不比使用整个表名更好(甚至可能更糟)。

      相关子查询也避免了外部聚合——让您从第一个表中选择所有列,这正是您想要的。如果使用正确的索引,它们通常也有更好的性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 1970-01-01
        • 2016-06-21
        • 1970-01-01
        • 2013-04-30
        • 2012-09-20
        • 1970-01-01
        相关资源
        最近更新 更多