【问题标题】:Best approach for limiting rows coming back in SQL when joining for a sum加入求和时限制 SQL 中返回的行的最佳方法
【发布时间】: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)

【问题讨论】:

    标签: sql oracle


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2022-08-02
      • 2019-02-05
      • 2019-02-05
      • 2015-11-15
      • 2017-04-09
      • 1970-01-01
      • 2010-09-07
      • 2018-03-24
      • 2018-10-25
      相关资源
      最近更新 更多