Среднее количество месяцев SQL и среднее с начала года - PullRequest
0 голосов
/ 04 января 2019

Я хочу запросить среднее значение за месяц и объединить со средним значением с начала года, я уже сделал среднемесячное значение, но не имею понятия для объединения среднего с начала года.

sqlfiddle, отредактировано из Mr Avi Code

sqlFiddle link

SELECT TO_CHAR(order_month, 'MON-YY'), order_avg
  FROM (
    SELECT TRUNC("Dayofmonth", 'MM') AS order_month, AVG("Numbervalue") AS order_avg
      FROM RAW_AVG
     GROUP BY TRUNC("Dayofmonth", 'MM')
     ORDER BY order_month
)

Ожидаемый результат

|ЯНВ-18 |12.000000 |Средний (январь)

|ФЕВ-18 |13.423729 |Среднее (с 1 января по 28 февраля)

|МАР-18 |13.476923 |Среднее значение (с 1 января по 6 марта)

Схема

  CREATE TABLE RAW_AVG
    ("Dayofmonth" date, "Numbervalue" int)
;

INSERT ALL 
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('01-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('02-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('03-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('04-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('05-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('06-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('07-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('08-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('09-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('10-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('11-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('12-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('13-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('14-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('15-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('16-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('17-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('18-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('19-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('20-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('21-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('22-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('23-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('24-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('25-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('26-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('27-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('28-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('29-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('30-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('31-Jan-2018', 12)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('01-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('02-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('03-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('04-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('05-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('06-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('07-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('08-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('09-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('10-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('11-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('12-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('13-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('14-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('15-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('16-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('17-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('18-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('19-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('20-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('21-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('22-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('23-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('24-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('25-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('26-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('27-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('28-Feb-2018', 15)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('01-Mar-2018', 14)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('02-Mar-2018', 14)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('03-Mar-2018', 14)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('04-Mar-2018', 14)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('05-Mar-2018', 14)
    INTO RAW_AVG ("Dayofmonth", "Numbervalue")
         VALUES ('06-Mar-2018', 14)
SELECT * FROM dual
;

ОТВЕТ Я получил ожидаемый результат, используя приведенный ниже код (измените код Mr Avi).'6-MAR-18' - это симуляция sysdate.today ()

    with Ungroup_AVG AS
    (
    select    lastday,
    Round(Avg(totalpermonth) over (order by lastday rows between unbounded preceding and 
    Current row),6) as Valuespermonth
    from (
      select
      --last_day("Dayofmonth") lastday
      CASE WHEN
          "Dayofmonth" = '6-MAR-18' AND "Dayofmonth" < last_day('6-MAR-18' ) OR "Dayofmonth">=  trunc(last_day('6-MAR-18')-1, 'mm')
          THEN
          --to_date('6-MAR-18','DD-MON-YY')
           "Dayofmonth"
          ELSE
          last_day("Dayofmonth") 
          END lastday,
      Avg("Numbervalue") totalpermonth
      from RAW_AVG
      group by last_day("Dayofmonth"), "Dayofmonth") z  )
    ,
    Last_dayofMonth as(
      select max(lastday) as "DATEA" from Ungroup_AVG group by TRUNC(lastday, 'MM')
      )
    ,AVGZ as(  
      SELECT lastday,MAX(Valuespermonth) FROM Ungroup_AVG GROUP BY lastday,TRUNC(lastday, 'MM')
      )
    select M.* from Last_dayofMonth L
    JOIN
    AVGZ M on L."DATEA"= M.lastday
      ;

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Вы можете сделать как скользящее среднее значение в месяц, чтобы получить ваш результат.Поскольку у вас есть данные на основе строк, вы можете сначала сделать то же самое, получить среднее значение за месяц, а затем скользящее среднее за весь год.Обратите внимание, что будет десятичная разница, если вы усредните все сразу (как вы сделали в Excel), а затем в SQL, так как сначала вам понадобится одна строка в месяц.

With Cte as (select to_date('01-Jan-18', 'DD-MM-YY') Dayofmonth, 15 as Numbervalue 
from dual 
union all 
select to_date('02-Jan-18', 'DD-MM-YY') Dayofmonth, 23 as Numbervalue from dual 
union all 
select to_date('03-Jan-18', 'DD-MM-YY') Dayofmonth, 3 as Numbervalue from dual 
union all 
select to_date('04-Jan-18', 'DD-MM-YY') Dayofmonth, 22 as Numbervalue from dual 
union all 
select to_date('05-Jan-18', 'DD-MM-YY') Dayofmonth, 11 as Numbervalue from dual 
union all 
select to_date('06-Jan-18', 'DD-MM-YY') Dayofmonth, 33 as Numbervalue from dual 
union all 
select to_date('07-Jan-18', 'DD-MM-YY') Dayofmonth, 44 as Numbervalue from dual 
union all 
select to_date('01-Feb-18', 'DD-MM-YY') Dayofmonth, 33 as Numbervalue from dual 
union all 
select to_date('02-Feb-18', 'DD-MM-YY') Dayofmonth, 11 as Numbervalue from dual 
union all 
select to_date('03-Feb-18', 'DD-MM-YY') Dayofmonth, 22 as Numbervalue from dual 
union all 
select to_date('04-Feb-18', 'DD-MM-YY') Dayofmonth, 33 as Numbervalue from dual 
union all 
select to_date('05-Feb-18', 'DD-MM-YY') Dayofmonth, 44 as Numbervalue from dual 
union all 
select to_date('06-Feb-18', 'DD-MM-YY') Dayofmonth, 22 as Numbervalue from dual 
union all 
select to_date('07-Feb-18', 'DD-MM-YY') Dayofmonth, 11 as Numbervalue from dual 
union all 
select to_date('01-Mar-18', 'DD-MM-YY') Dayofmonth, 12 as Numbervalue from dual 
union all 
select to_date('02-Mar-18', 'DD-MM-YY') Dayofmonth, 23 as Numbervalue from dual
union all 
select to_date('03-Mar-18', 'DD-MM-YY') Dayofmonth, 34 as Numbervalue from dual 
union all 
select to_date('04-Mar-18', 'DD-MM-YY') Dayofmonth, 54 as Numbervalue from dual
union all 
select to_date('05-Mar-18', 'DD-MM-YY') Dayofmonth, 2 as Numbervalue from dual 
union all 
select to_date('06-Mar-18', 'DD-MM-YY') Dayofmonth, 12 as Numbervalue from dual)


select    lastday,
Round(Avg(totalpermonth) over (order by lastday rows between unbounded preceding and 
Current row),2) as Valuespermonth
from (
select  last_day(Dayofmonth) lastday, Avg(NumberValue) totalpermonth
from cte
group by last_day(Dayofmonth) ) z  ; 

Объяснение: Ряды между неограниченным предыдущим будут занимать всю предыдущую строку и текущую строку и получать среднее значение до текущей строки.Таким образом, за февраль потребуется январь и февраль, а за март - среднее значение за январь, февраль и март.

Выход:

 LASTDAY    VALUESPERMONTH
 31-JAN-18  21.57
 28-FEB-18  23.36
 31-MAR-18  23.18
0 голосов
/ 04 января 2019

Не зная, какой метод вам нужен:

SELECT
    TO_CHAR( order_month, 'MON-YY' )
  , order_avg
  , AVG( order_avg ) OVER () AS YTD_avg
FROM (
    SELECT
        TRUNC( "Date", 'MM' ) AS order_month
      , AVG( "NumberA" )      AS order_avg
    FROM RAW_AVG
    GROUP BY
        TRUNC( "Date", 'MM' )
    ORDER BY
        order_month
) d

или, возможно:

SELECT
    TO_CHAR( order_month, 'MON-YY' ) AS Label
  , order_avg
FROM (
    SELECT
        TRUNC( "Date", 'MM' ) AS order_month
      , AVG( "NumberA" )      AS order_avg
    FROM RAW_AVG
    GROUP BY
        TRUNC( "Date", 'MM' )
    ORDER BY
        order_month
) d
UNION ALL
SELECT
    'Total'
  , AVG( NumberA )
FROM RAW_AVG
...