Подсчет итогов по группам

Я новичок в SQL и работаю с ним только около 4 месяцев. Однако мне нужно построить хранимую процедуру, которая может вычислить сумму для одинаковых элементов (используя числовой идентификатор, т. Е. Вычислить сумму E.ThisNumber Where E.ThatNumber = 'Whatever')

Вот код, который у меня есть для получения нужных мне записей:

SELECT *
FROM BarRevenueByProcedurePriceInfo
WHERE DeptID = '010.4730'
AND SegmentDateTime = '2013-11-30 00:00:00.000'
ORDER BY ProcedureID

Вот вывод:

                           ProcedureID/
RowUpdateTime   Dept Code  E.ThatNumber  E.ThisNumber  E.WhatIneed

2013-11-30      010.4730    4200028      108.15       108.15
2013-11-30      010.4730    4200028       18.18       126.33
2013-11-30      010.4730    4200028       63.63       189.81
2013-11-30      010.4730    4200069        5.00         5.00
2013-11-30      010.4730    4200069        5.01        10.01
2013-11-30      010.4730    4200069        6.00        16.01

Обратите внимание, как счетчик сбрасывается, когда значение E.ThatNumber отличается от предыдущей записи. Любая помощь будет принята с благодарностью. Спасибо!

Уильям Харли

2 ответа

Решение

Не уверен на 100%, что вам нужно, это может быть так:

SELECT *,
       SUM(ThisNumber) OVER (PARTITION BY ProcedureID)
FROM BarRevenueByProcedurePriceInfo
WHERE DeptID = '010.4730'
AND SegmentDateTime = '2013-11-30 00:00:00.000'
ORDER BY ProcedureID

SQL Server 2012 поддерживает накопленную сумму как:

SELECT *,
       sum(thisnumber) over (partition by procedureId order by (select NULL)) as whatIneed
FROM BarRevenueByProcedurePriceInfo
WHERE DeptID = '010.4730' AND
      SegmentDateTime = '2013-11-30 00:00:00.000'
ORDER BY ProcedureID;

В более ранних версиях вам нужно использовать коррелированный подзапрос или объединяться с агрегацией.

Кстати, нет очевидного упорядочения строк. Если вы делаете накопительную сумму, у вас действительно должен быть столбец, в котором указан порядок.

Другие вопросы по тегам