【问题标题】:Get Total Sum with User Sum使用用户总和获取总和
【发布时间】:2018-08-01 16:07:04
【问题描述】:

SQL 表:

UserId ReportsRead
  1        4
  2        6
  3        5

我想查询该表,以便得到以下信息:

UserId ReportsRead TotalReports
   1       4           15

问题在于,因为我应用了 WHERE 子句,所以我得到的总和将与用户报告读取的结果相同。

SELECT UserId, ReportsRead, SUM(ReportsRead) AS TotalReports FROM MyTable WHERE UserId = 1

是否有一个内置函数可以让我这样做?我想完全避免子查询。

【问题讨论】:

  • 您是否有理由要在此处避免子查询?您只选择一行,因此无论复杂程度如何,您运行的任何子查询都只会运行一次。
  • @ZLK 是的,“MyTable”实际上是一个相当长的子查询,我不想运行两次。我把它展示在这里作为我的桌子,试图让事情变得简单。
  • 在这种情况下,您可能希望将答案中建议的 SUM() OVER() 窗口函数的想法合并到您的长子查询中,这样您只需选择一个附加列,假设您只想在最后选择一列。

标签: sql sql-server


【解决方案1】:

使用sum窗口函数。

SELECT UserId, ReportsRead, SUM(ReportsRead) OVER() AS TotalReports 
FROM MyTable

使用过滤条件获取特定的userId,如

SELECT * 
FROM (SELECT UserId, ReportsRead, SUM(ReportsRead) OVER() AS TotalReports 
      FROM MyTable
     ) t
WHERE UserId=1

【讨论】:

    【解决方案2】:

    在这种情况下我通常不推荐子查询,但在这种情况下,它似乎是一种简单的方法:

    SELECT UserId, ReportsRead,
           (SELECT SUM(ReportsRead) from MyTable) AS TotalReports
    FROM MyTable
    WHERE UserId = 1;
    

    如果您想要所有个用户的行,那么窗口函数是最好的选择:

    select t.*, sum(reportsread) over () as totalreports
    from mytable;
    

    但是,您不能在包含 where 子句的同时仍然期望得到正确的总数。

    【讨论】:

      猜你喜欢
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多