为了学习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
输出(突出显示的列应与其他值相同。)
答案 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