【问题标题】:Running total per row for column value in SQL ServerSQL Server 中列值的每行总计
【发布时间】:2019-07-08 23:12:26
【问题描述】:

我有一个查询,该查询返回员工工作了一天的 DateTime Spans、该时间与一年中的哪一周以及这些时间跨度的日期。它工作得非常好,但我想计算特定一周中每一天的运行总数。

目前,我的查询如下所示:

SELECT A.*
FROM (
    SELECT WeekNumber, SUM(NumberOfSecondsWorked) AS NumberOfSecondsWorkedInDay, MIN(FromTime) AS StartOfDay, MAX(ToTime) AS EndOfDay, (SELECT WeeklyTotal = SUM(NumberOfSecondsWorked) FROM #temp AS T2 WHERE T2.WeekNumber = T1.WeekNumber) AS WeeklyTotal
    FROM #temp AS T1 GROUP BY DayMonth, WeekNumber) A

然后返回:

我遇到的问题是我希望每周总计按 Row 汇总,因此数据如下所示:

每行的每周总和。谁能告诉我我在查询中做错了什么?

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您的查询和结果集并不完全一致。例如,您的结果集有 StartOfDay

但是,你似乎想要:

SELECT WeekNumber, SUM(NumberOfSecondsWorked) AS NumberOfSecondsWorkedInDay,
       MIN(FromTime) AS StartOfDay, MAX(ToTime) AS EndOfDay,
       SUM(SUM(NumberOfSecondsWorked)) OVER (PARTITION BY WeekNumber ORDER BY MIN(FromTime))
FROM #temp AS T1
GROUP BY DayMonth, WeekNumber;

编辑:

在 SQL Server 2008 中,您需要一种不同的方法,例如相关子查询:

WITH wn as (
      SELECT WeekNumber, SUM(NumberOfSecondsWorked) AS NumberOfSecondsWorkedInDay,
             MIN(FromTime) AS StartOfDay, MAX(ToTime) AS EndOfDay
      FROM #temp T1
      GROUP BY DayMonth, WeekNumber
     )
SELECT wn.*,
       (SELECT SUM(wn2.NumberOfSecondsWorked)
        FROM wn wn2
        WHERE wn2.WeekNumber = wn.WeekNumber AND
              wn2.FromTime <= wn.FromTime
       )
FROM wn;

【讨论】:

  • 我似乎必须 ORDER BY MIN(FromTime) AS StartOfDay 在同一个 select 语句中声明,这是正确的吗?
  • 是否可以在 SQL Server 2008 中为此查询执行此操作?谢谢!
【解决方案2】:

使用窗口函数尝试如下操作

     SELECT WeekNumber,
     SUM(NumberOfSecondsWorked) AS NumberOfSecondsWorkedInDay,
     MIN(FromTime) AS StartOfDay, MAX(ToTime) AS EndOfDay,
     SUM(NumberOfSecondsWorked) over( order by WeekNumber) AS WeeklyTotal
    FROM #temp AS T1
    GROUP BY DayMonth, WeekNumber

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2015-01-04
    • 2018-02-21
    • 1970-01-01
    • 2022-11-22
    • 2010-10-26
    相关资源
    最近更新 更多