Расчеты SQL: Выполнить AVERAGE, используя данные ЭТОГО года, ПОСЛЕДНЕГО года и СЛЕДУЮЩЕГО года? - PullRequest
0 голосов
/ 01 декабря 2010

Я изо всех сил пытаюсь воссоздать определенный расчет в SQL, который я могу сделать в Excel. Это касается средних.

Мы собираем данные за многие годы. Одна таблица, которую мы создаем - это среднее значение за три года. Ниже приведены таблицы, которые показывают: 1) данные RAW и 2) новую таблицу с данными AVERAGE. «Размеры» - это [Год] и [Код товара].

Средние данные основаны на усреднении годовой цифры с двумя годами по обе стороны. то есть средний показатель за 1991 год = средний (1990, 1992, 1992 годы). = СРЕДНИЙ (B2: D2)

1) RAW альтернативный текст http://i55.tinypic.com/o9pc8g.jpg

2) СРЕДНИЙ

альтернативный текст http://i56.tinypic.com/5d12dz.jpg

В Excel это выглядит просто: усредненная формула, которая затем перетаскивается в другие ячейки, или в VBA с использованием ссылок R1C1.

Но что это в SQL? Как вы говорите, используйте «этот» год и год до и год после данных?

Кроме того, я понимаю, что если бы была пустая ячейка, это выкинуло бы мои вычисления, так как же вы управляете значениями NULL, чтобы он вычислял только, когда нужно использовать три цифры? ... и затем делал все это снова до завершения ( много лет и много, много ItemCodes)

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2010

Ниже я создал пример, в котором я усредняю ​​значение за 1994 год, чтобы вы начали.Запрос SQL должен работать в любой СУБД.Тем не менее, каждая база данных имеет лучший подход, если вы можете использовать специальные функции поставщика.Например, используя аналитику Oracle, вы можете вычислить скользящее среднее и получить доступ к предыдущей / следующей строке почти так же, как и хотели.

drop table t;

create table t(
   item_code varchar(10) not null
  ,year      int not null
  ,figure    decimal(5,2) not null
  ,primary key(year, item_code)
);

insert into t(item_code, year, figure) values('A', 1990, 5);
insert into t(item_code, year, figure) values('A', 1991, 7.2);
insert into t(item_code, year, figure) values('A', 1992, 9.2);
insert into t(item_code, year, figure) values('A', 1993, 12.5);
insert into t(item_code, year, figure) values('A', 1994, 10);
insert into t(item_code, year, figure) values('A', 1995, 9);

insert into t(item_code, year, figure) values('B', 1990, 16);
insert into t(item_code, year, figure) values('B', 1991, 17);
insert into t(item_code, year, figure) values('B', 1992, 10);
insert into t(item_code, year, figure) values('B', 1993, 13);
insert into t(item_code, year, figure) values('B', 1994, 15.5);
insert into t(item_code, year, figure) values('B', 1995, 12);

insert into t(item_code, year, figure) values('C', 1990, 4);
insert into t(item_code, year, figure) values('C', 1991, 9);
insert into t(item_code, year, figure) values('C', 1992, 15);
insert into t(item_code, year, figure) values('C', 1993, 12);
insert into t(item_code, year, figure) values('C', 1994, 10);
insert into t(item_code, year, figure) values('C', 1995, 7.2);



select item_code
      ,1994 as year
      ,sum(case when year = 1995 then figure else 0 end) as next_year
      ,sum(case when year = 1994 then figure else 0 end) as this_year
      ,sum(case when year = 1993 then figure else 0 end) as prev_year
      ,sum(figure) / count(*) as avg
  from t
 where year in(1993, 1994, 1995)
 group 
    by item_code
having count(*) = 3;

count (*) = 3 удовлетворяет условию, чтосреднее значение будет вычислено только при наличии трех лет.Очевидно, вы должны заменить константы некоторой переменной.Кроме того, запрос вычисляет только средние значения за 1 год.

0 голосов
/ 01 декабря 2010

Вы не заявляете технологию, предполагая MSSQL.

Предположим, mydate 2010

SELECT dateadd(Year, -1, mydate), mydate, dateadd(Year, 1, mydate) 
   FROM SomethingOrOther

возвращает

2009, 2010, 2011

DATEADD документация

Предположим, что x, y, z равны NULL

SELECT COALESCE(x, y, z, 0)

возвращает

0

Документация COALESCE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...