Итоговая сумма на строку для значения столбца в SQL Server - PullRequest
0 голосов
/ 05 июля 2019

У меня есть запрос, который возвращает DateTime Spans, с которыми сотрудник работал в течение дня, к какой неделе года относится это время и к дате span.Это работает очень хорошо, но я хочу вычислить промежуточную сумму по дням для каждого дня в конкретной неделе.

В настоящее время мой запрос выглядит следующим образом:

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

И возвращает это:

enter image description here

Проблема, с которой я столкнулся, заключается в том, что я хотел бы, чтобы итоговая сумма за неделю складывалась по строкам за каждую неделю, чтобы данные выглядели какследующее:

enter image description here

Где итоговая сумма за неделю для каждой строки.Может кто-нибудь сказать мне, что я делаю неправильно в моем запросе?

Ответы [ 2 ]

3 голосов
/ 05 июля 2019

Ваш запрос и ваш набор результатов не совсем соответствуют друг другу.Например, ваш результирующий набор имеет значение 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;
1 голос
/ 05 июля 2019

попробуйте, как показано ниже, используя оконную функцию

     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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...