在MySql上提前过滤结果

时间:2018-01-31 05:29:23

标签: c# mysql

我想使用下面显示的代码显示每位客户所有商品总和的结果,但它只显示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上添加了“可乐”。我如何显示每个客户的每个细节项目的总量。

感谢。

1 个答案:

答案 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;

enter image description here

但是这种方法的缺点是结果只包含实际出现在数据中的用户/项目组合的标签。如果您想要一个显示所有用户和所有项目的报告,即使交易量为零,那么我们还需要做更多的工作:

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;

enter image description here

这种数据格式更适合绘图(我认为),因为它是常规的,并显示每个客户和每个可能的项目,以及每对的总量。