SQL - перевод дневных данных в среднее значение за месяц, совокупная сумма до конца месяца
У меня есть ежедневные данные, поступающие из базы данных.В ней есть таблица, которая содержит много столбцов - Дата, Имя объекта, Значение1, Значение2, Значение3, ... Я хочу определить среднее значение за месяц для каждого объекта.Также для определенных значений мне нужно накопленное значение суммы с начала до конца месяца (накопленная сумма на конец месяца).
Пример:
Date Entity Value1 Value2 Value3 Value4
01/01/2017 'ZZ-01' 5 10 25 10
01/01/2017 'BB-01' 5 10 25 10
02/01/2017 'ZZ-01' 2 1 5 0
02/01/2017 'BB-01' 2 1 5 0
03/01/2017 'ZZ-01' 5 10 25 10
03/01/2017 'BB-01' 5 10 25 10
.....
.....
31/01/2017 'ZZ-01' 5 10 25 10
31/01/2017 'BB-01' 5 10 25 5
01/02/2017 'ZZ-01' 5 10 25 15
01/02/2017 'BB-01' 5 10 25 11
02/02/2017 'ZZ-01' 5 10 25 15
.......
28/02/2017 'ZZ-01' 5 10 25 10
28/02/2017 'BB-01' 5 10 25 10
....
и т. Д.
Я хотел бы создать таблицу, которая выглядит следующим образом:
Month Entity AvgValue1 AvgValue2 CumValue2 AvgValue3 AvgValue4
Jan-2017 'ZZ-01' Avg1 Avg2 CumV2 Avg3 Avg4
Jan-2017 'BB-01'
Feb-2017 'ZZ-01'
Feb-2017 'BB-01'
Mar-2017 'ZZ-01'
...
Среднее значение дляданный месяц для каждого значения.Для некоторых значений мне нужна накопительная сумма до конца месяца с начала данных в таблице.
В результате поиска в стековом потоке я обнаружил, что могу использовать приведенную ниже таблицу, чтобы получить сумму, и накопленную
SELECT Date, Name, Sum, Avg,
(SELECT SUM(Value1)
FROM mytable as t2
Where t2.Date <=t1.Date) as CumVal
from mytable as t1
order by t1.DateO ASC, Name
и ниже в среднем за месяц
SELECT
dateadd(month, datediff(month, 0, t2.Date), 0) as Month,
AVG(t2.Value1) as AvgValue1
FROM mytable as t2
group by dateadd(month, datediff(month, 0, t2.Date), 0)
Но я не могу объединить эти вещи в один запрос, который помогает в создании таблицы.Ваша помощь приветствуется.
Я пытался создать небольшой тестовый код с одним столбцом значения:
IF OBJECT_ID('dbo.mytable', 'U') IS NOT NULL
BEGIN
DROP TABLE dbo.mytable
END
CREATE TABLE mytable
([DateOn] datetime, [Name] varchar(10), [Rate1] float, [Rate2] float,
[Rate3] float)
;
INSERT INTO mytable
([DateOn], [Name], [Rate1])
VALUES
-- MM/DD/YYYY format
-- value for first 4 days is shown. assume that the rest days are zero
-- average will be (sum /31) in January
('01/01/2017' , 'AA-01', 10),
('01/01/2017' , 'BB-01', 100),
('01/02/2017' , 'AA-01', 15),
('01/02/2017' , 'BB-01', 200),
('01/03/2017' , 'AA-01', 20),
('01/03/2017' , 'BB-01', 300),
('01/04/2017' , 'AA-01', 25),
('01/04/2017' , 'BB-01', 400),
('02/01/2017' , 'AA-01', 10),
('02/01/2017' , 'BB-01', 100),
('02/02/2017' , 'AA-01', 15),
('02/02/2017' , 'BB-01', 200),
('02/03/2017' , 'AA-01', 20),
('02/03/2017' , 'BB-01', 300),
('02/04/2017' , 'AA-01', 25),
('02/04/2017' , 'BB-01', 400)
;
Select dateadd(month, datediff(month, 0, t1.DateOn), 0) as Month, Name,
AVG(t1.Rate1) as AvgRate1,
(
SELECT SUM(Rate1)
FROM mytable as t2
Where t2.DateOn <=t1.DateOn
)
as CumRate
from mytable as t1
--order by t1.DateOn ASC,Name
group by dateadd(month, datediff(month, 0, t1.DateOn), 0)
DROP TABLE dbo.mytable
Я запускаю этот тест на https://rextester.com/CFHEW85984
, но получаюошибка:
Ошибка (и), предупреждение (я): столбец «mytable.DateOn» недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.
Столбец mytable.Name недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.
формат таблицы ожидаемых результатов:
Month Name AvgRate CumRate
Jan-17 AA-01 2.258 70
Jan-17 BB-01 32.258 1000
Feb-17 AA-01 2.5 140
Feb-27 BB-01 35.714 2000
поэтому для 17 января для имени AA-01 я складываю дневные цифры (в этом примере только 4 дня, остальные предполагают 0) и делю на 31, чтобы получить среднее значение за месяц.Затем я суммирую их, чтобы получить кумулятивный результат.В феврале среднее значение выполняется так же, как и в w, но кумулятивным является cum_jan + cum_feb.и так далее
Я изо всех сил пытаюсь объединить это с объединением.
Спасибо