【问题标题】:using aggregate functions before joining the tables在加入表之前使用聚合函数
【发布时间】:2019-04-20 08:07:07
【问题描述】:

我有两个表并在 customer_id 上加入它们。

第一个表是交易,我将交易数据存储在那里。而且每笔交易都有数量和休息,支付等。

第二个表是句柄,我很难解释这个表的用途,但句柄表是同一个交易表,它有 volume_handle、rest_handle、pay_handle 等。

我必须使用左连接,因为我想要交易表中的所有记录以及句柄表中的匹配记录

我想对交易量和余量求和,从句柄中求和volume_handle,这些表之间的关系是customer_id 和buy_id。

例如交易表:

id = 1
volume = 1000
rest = 1000
customer_id = 1
---------------
id = 2
volume = 500
rest = 0
customer_id = 1
---------------
id = 3 
volume = 2000
rest = 0
customer_id = 2

句柄表是:

id = 1
volume_handle = 3000
buy_id = 1

我写的查询是:

select sum(deal.rest) as rest , sum(deal.volume) as volume , sum(handle.volume_handle) as handle  
from deal 
left join handle on deal.customer_id = handle.buy_id  
group by deal.customer_id;

这个查询的结果是:

//when customer_id is 1
volume = 1500
rest = 1000
handle = 6000

//when customer_id is 2
volume = 2000
rest = 0
handle = null

体积和其余部分是正确的,但第二个表的句柄是错误的,因为 sum(handle.volume_handle) 的结果是 3000 而不是 6000(当 customer_id 为 1 时)

我不知道在加入表格之前如何使用聚合函数。

这里的任何人都可以为这个问题编写查询吗?

【问题讨论】:

    标签: mysql sql codeigniter join aggregate


    【解决方案1】:

    因为对于每个 deal.customer_id 值,您可以在 handle 中拥有多行,因此您需要在该表中执行聚合您将 JOINdeal 之前。像这样的:

    SELECT d.customer_id,
           SUM(d.rest) AS rest,
           SUM(d.volume) AS volume,
           MAX(h.volume_handle) AS handle
    FROM deal d
    LEFT JOIN (SELECT buy_id, SUM(volume_handle) AS volume_handle
               FROM handle
               GROUP BY buy_id) h ON h.buy_id = d.customer_id
    GROUP BY d.customer_id
    

    输出:

    customer_id rest    volume  handle
    1           1000    1500    3000
    2           0       2000    null
    

    Demo on dbfiddle

    请注意,我在h.volume_handle 周围使用了MAX,这不会改变结果(因为它将测试的所有值都是相同的),但需要避免任何only_full_group_by 错误。

    【讨论】:

    • 当我将 MAX 替换为 SUM 时,输出再次出错并给我 6000 而不是 3000。我想要 handle_volume 的总和而不是它的最大值 :)
    • 哦,现在我明白了。您在子查询中使用 sum 函数并使用 max 得到它。谢谢它的作品
    • @sajadsholi 是的,MAX以避免only_full_group_by 错误。 SUM 在子查询中执行,MAX 只是确保我们只得到一个结果。你可以很容易地使用MIN
    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多