带有连接的SQL Aggregate提供的结果不正确

时间:2017-10-29 13:55:11

标签: mysql sql join sum aggregate

为了学习SQL,我已经在Excel中生成的几个表中添加了一些虚拟数据。我有一张客户,订单标题和订单行的表格。

我试图检查客户是否平衡,订单总计和总计都匹配。

但是当我运行这个查询时,我得到了orderheader的错误输出,我相信这是因为它在订单行表被引用的次数上做了SUM。

有谁能告诉我我应该这样做的正确方法?

SELECT 
    cus.cus_id,
    cus.cus_name,
    cus.cus_balance,
    SUM(orderheader.orderheader_currentsell) AS orderHeader_total,
    SUM(orderlines.orderlines_currentsell) AS orderLines_total
FROM
    cus
        JOIN
    orderheader ON orderheader.orderHeader_customer = cus.cus_id
        JOIN
    orderlines ON orderlines.orderlines_orderid = orderheader.orderHeader_id
GROUP BY cus.cus_name

输出(突出显示的列应与其他值相同。)

Results

3 个答案:

答案 0 :(得分:0)

标题有多行。要解决此问题,请在执行join之前汇总。在您的情况下,只需汇总订单行就足够了:

SELECT c.cus_id, c.cus_name, c.cus_balance,
    SUM(oh.orderheader_currentsell) AS orderHeader_total,
    SUM(ol.orderLines_total) AS orderLines_total
FROM cus c JOIN
     orderheader oh
     ON oh.orderHeader_customer = c.cus_id JOIN
     (SELECT ol.orderlines_orderid, SUM((ol.orderlines_currentsell) as orderLines_total
      FROM orderlines ol
      GROUP BY ol.orderlines_orderid
     ) ol
     ON ol.orderlines_orderid = oh.orderHeader_id
GROUP BY cus.cus_name;

答案 1 :(得分:0)

因为你有不同级别的分组,所以不是那么简单,你需要子选择。

您可以在字段列表中计算每个客户的总数作为子选择。在下面的代码中,我只针对订单执行了此操作,但您可以对仍然通过分组解决的订单行执行相同的操作。

SELECT 
    cus.cus_id,
    cus.cus_name,
    cus.cus_balance,
    ( SELECT 
          SUM(orderheader_currentsell) 
      FROM
          orderheader 
      WHERE 
          orderheader.orderHeader_customer = cus.cus_id) AS orderHeader_total,
    SUM(orderlines.orderlines_currentsell) AS orderLines_total
FROM
    cus
JOIN
    orderlines ON orderlines.orderlines_orderid = orderheader.orderHeader_id
GROUP BY cus.cus_name

答案 2 :(得分:0)

这是乍一看,但我注意到你有:

cus.cus_id,
cus.cus_name,
cus.cus_balance,

作为非聚合列。但是在你的小组中 - 你只有:

GROUP BY cus.cus_name 

Group By应包含所有非聚合列。这可能就是为什么你没有得到预期的结果。那将改为:

GROUP BY cus.cus_id,
         cus.cus_name,
         cus.cus_balance