加入求和时限制 SQL 中返回的行的最佳方法

Posted

技术标签:

【中文标题】加入求和时限制 SQL 中返回的行的最佳方法【英文标题】:Best approach for limiting rows coming back in SQL when joining for a sum 【发布时间】:2019-12-10 11:25:30 【问题描述】:

我需要取回用户列表和他们订购的总金额。实际上,我的查询更复杂,但我认为这总结了它。我的问题是,例如,如果一个用户下了 5 次订单,我会取回他们的姓名以及他们因加入而订购了 5 次的总数(该用户的订单表中有 5 行)。

当您需要汇总一个包含多行的表中的记录而不需要返回许多行时,推荐的方法是什么?不同的可以工作,但这是最好的吗? (尤其是当我的选择选择的信息比下面的更多时)

SELECT user.name, sum(order.amount) FROM USER user
    INNER JOIN USER_ORDERS order
       ON (user.user_id = order.user_id)

【问题讨论】:

【参考方案1】:

您只是在寻找GROUP BY吗?

SELECT u.name, SUM(o.amount)
FROM USER u JOIN
     USER_ORDERS uo
     ON u.user_id = uo.user_id
GROUP BY u.name, u.user_id;

请注意,这已将user_id 包含在GROUP BY 中,以防两个用户具有相同的名称。

如果您想要所有用户,即使是没有订单的用户,那么您想要LEFT JOIN

SELECT u.name, SUM(o.amount)
FROM USER u LEFT JOIN
     USER_ORDERS uo
     ON u.user_id = uo.user_id
GROUP BY u.name, u.user_id;

或相关子查询:

SELECT u.name,
       (SELECT SUM(o.amount)
        FROM USER_ORDERS uo
        WHERE u.user_id = uo.user_id
       )
FROM USER u;

【讨论】:

Group by 看起来不错,但是当我在我的选择中放置更多列时,它也需要进入我的组,然后有时会导致多行。 @rcoin 。 . . (1) 是的。 GROUP BY 必须与聚合查询中的 SELECT 一致。 (2) 这回答了您实际提出的问题。如果您有其他问题,请提出 问题。 (3) 相关子查询为您提供了更大的灵活性,因为没有GROUP BY【参考方案2】:

您可以使用 SUM 的分析版本。

SELECT u.name, SUM(o.amount) OVER(PARTITION BY u.name)
FROM USER u JOIN
     USER_ORDERS uo
 ON u.user_id = uo.user_id;

【讨论】:

以上是关于加入求和时限制 SQL 中返回的行的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

SQL CE:限制查询中返回的行

LIMIT和OFFSET

SQL Server - 将条件链接到原始行的 SUM 前面的行

TSQL:有没有办法限制返回的行并计算在没有限制的情况下返回的总数(不将其添加到每一行)?

如何在 JDBC 数据源级别限制从 Oracle 返回的行数?

如何编辑对已经定义并填写在mysql中的行的限制