我想使用下面显示的代码显示每位客户所有商品总和的结果,但它只显示1项。
MySql数据
Acct_Table
cust_id cust_name cust_group 1001 Customer A normal 1002 Customer B vip 1003 Customer C normal
Trans_Table
cust_id trans_volume trans_details trans_date 1001 2 milk 2018-01-01 1002 1 coke 2018-01-01 1001 1 beer 2018-01-02 1003 5 bottled water 2018-01-03 1001 1 coffee 2018-01-03 1001 1 coke 2018-01-03
SELECT DISTINCT
Trans_Table.cust_id,
Trans_Table.trans_details,
SUM(Trans_Table.trans_volume) netvolume
FROM Trans_Table
INNER JOIN Acct_Table
on Trans_Table.cust_id = Acct_Table.cust_id
WHERE
Trans_Table.trans_date '2018-01-01' AND
'2018-01-03' AND
Acct_Table.cust_group IN ('normal','vip')
GROUP BY Trans_Table.trans_details
结果在1001上只有2个项目,我怀疑在1002上添加了“可乐”。我如何显示每个客户的每个细节项目的总量。
感谢。
答案 0 :(得分:1)
只需按用户和项目汇总:
SELECT
a.cust_id,
t.trans_details,
SUM(t.trans_volume) AS total_volume
FROM Acct_Table a
INNER JOIN Trans_Table t
ON a.cust_id = t.cust_id
GROUP BY
a.cust_id,
t.trans_details;
但是这种方法的缺点是结果只包含实际出现在数据中的用户/项目组合的标签。如果您想要一个显示所有用户和所有项目的报告,即使交易量为零,那么我们还需要做更多的工作:
SELECT
a.cust_id,
t.trans_details,
COALESCE(SUM(t.trans_volume), 0) AS total_volume
FROM Acct_Table a
CROSS JOIN (SELECT DISTINCT trans_details FROM Trans_Table) td
LEFT JOIN Trans_Table t
ON a.cust_id = t.cust_id AND
td.trans_details = t.trans_details
GROUP BY
a.cust_id,
td.trans_details
ORDER BY
a.cust_id,
td.trans_details;
这种数据格式更适合绘图(我认为),因为它是常规的,并显示每个客户和每个可能的项目,以及每对的总量。