SQL: процентное изменение для всех возможных комбинаций

Я начал изучать SQL и получил следующие таблицы (они содержат гораздо больше данных, но только те, которые кажутся необходимыми для решения проблемы).

ВЕЩЬ:

item_keys   deparment_desc
----------------------------
10001       Womens Clothing  
10002       Womens Clothing  
10003       Sporting Goods

ПРОДАЖИ:

cur_trn_date  item_key  store_key  tot_sls_qty
----------------------------------------------
1999-12-01    10001     1          8346.17  
1999-12-01    10001     2          235.40 
.  
.  
.  
2001-12-31    2001-12-31  10       1108.33

ХРАНИТЬ:

store_key   type_key   type_desc
--------------------------------
1           1          Super Malls  
2           2          Strip Malls  
3           3          Retail Only  
.  
.  
.  
10          1           Super Malls

(Извините, если это не очень структурировано, я не смог найти способ создавать таблицы в StackOverflow)

Что я хотел бы получить, так это общий объем продаж за каждый год, а также процентное изменение по сравнению с прошлым годом. Все это для всех возможных комбинаций Department_desc и type_desc. Я попробовал это со следующим кодом, но, похоже, возникла проблема с CUBE и, возможно, с функцией LAG. Они являются неожиданным знаком.

SELECT YEAR(s.cur_trn_date) AS year, SUM(s.tot_sls_qty) AS sales,
(SUM(s.tot_sls_qty) - LAG(SUM(s.tot_sls_qty)) / SUM(s.tot_sls_qty)) AS difference
FROM sales s, item i, store st
GROUP BY YEAR(s.cur_trn_date)
CUBE(i.departmend_desc, st.type_desc)
WHERE s.item_key = i.item_key
AND s.store_key = st.store_key

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


person N.Messers    schedule 20.01.2020    source источник
comment
Совет сегодняшнего дня: всегда используйте современный, явный синтаксис JOIN. Легче писать (без ошибок), легче читать (и обслуживать) и легче преобразовывать во внешнее соединение, если это необходимо.   -  person jarlh    schedule 20.01.2020
comment
WHERE предшествует GROUP BY.   -  person jarlh    schedule 20.01.2020
comment
Я не смог найти способ создания таблиц в StackOverflow. См. здесь несколько советов по как создавать красивые таблицы.   -  person a_horse_with_no_name    schedule 20.01.2020


Ответы (1)


Из того, что вы описываете, запрос должен быть:

SELECT YEAR(s.cur_trn_date) AS year,
       SUM(s.tot_sls_qty) AS sales,
       (SUM(s.tot_sls_qty) - LAG(SUM(s.tot_sls_qty)) / 
        SUM(s.tot_sls_qty)
       ) AS difference
FROM sales s JOIN
     item i
     ON s.item_key = i.item_key JOIN
     store st
     ON s.store_key = st.store_key
GROUP BY GROUPING_SETS ( (YEAR(s.cur_trn_date)),
                         (YEAR(s.cur_trn_date), i.departmend_desc, st.type_desc),
                         (YEAR(s.cur_trn_date), i.departmend_desc),
                         (YEAR(s.cur_trn_date), st.type_desc)
                       );

Я не уверен, что синтаксис, который действительно будет работать, решит вашу проблему. (Я предпочитаю grouping sets, а не cube, потому что мне нравится четко указывать получаемые результаты.)

person Gordon Linoff    schedule 20.01.2020