Борьба с запросом суммы выполнения в SQL - PullRequest
1 голос
/ 23 апреля 2020

Я борюсь с этим запросом. Он правильно рассчитывает промежуточную сумму для первого депо, но как только он добирается до следующего депо, он должен начинаться с нуля для итоговой суммы, но он продолжается с конечной суммы предыдущего депо, что я делаю неправильно?

Вот мой запрос, я также добавил изображение вывода.

SELECT 
    Depot
    ,WorkDayNr
    ,DayOfMonth
    ,Tons
    ,SUM (Tons) OVER (ORDER BY Depot, WorkDayNr) AS RunTotal
FROM #Final
GROUP BY Depot, WorkDayNr, DayOfMonth, Tons
ORDER BY Depot, WorkDayNr

run

Ответы [ 3 ]

2 голосов
/ 23 апреля 2020

Вы должны разделить по депо:

SELECT 
    Depot,
    WorkDayNr,
    DayOfMonth,
    Tons,
    SUM(Tons) OVER (PARTITION BY Depot ORDER BY WorkDayNr) AS RunTotal
FROM #Final
ORDER BY
    Depot,
    WorkDayNr;

Также обратите внимание, что ваше предложение GROUP BY, вероятно, является излишним и ненужным, потому что вы на самом деле не выбираете какие-либо агрегаты. При использовании SUM в качестве аналитической функции c агрегация в нее уже свернута без необходимости использования GROUP BY.

2 голосов
/ 23 апреля 2020

Добавить partition предложение:

 SUM (Tons) OVER (PARTITION BY SUBGROUP ORDER BY Depot, WorkDayNr) AS RunTotal
2 голосов
/ 23 апреля 2020

Просто добавьте partition к оконной функции. Имена столбцов в наборе результатов не соответствуют запросу, поэтому я подозреваю, что вы хотите Depot вместо SubGrp

SUM (Tons) OVER (PARTITION BY Depot ORDER BY WorkDayNr) AS RunTotal

Кроме того, я не вижу смысла использовать агрегирование в этом запрос. Вы, кажется, путаете агрегатную функцию (SUM() без предложения OVER()), которая требует агрегирования, с оконной функцией. Что касается, ваш запрос должен быть просто:

SELECT 
    Depot,
    WorkDayNr,
    DayOfMonth,
    Tons,
    SUM (Tons) OVER (PARTITION BY Depot ORDER BY WorkDayNr) AS RunTotal
FROM #Final
ORDER BY Depot, WorkDayNr
...