SQL-запрос - перевод дневных данных в среднее значение за месяц, накопленная сумма до конца месяца? - PullRequest
0 голосов
/ 29 января 2019

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.и так далее

Я изо всех сил пытаюсь объединить это с объединением.

Спасибо

...