加入求和时限制 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 Server - 将条件链接到原始行的 SUM 前面的行
TSQL:有没有办法限制返回的行并计算在没有限制的情况下返回的总数(不将其添加到每一行)?