SQL: изменение percantage для всех возможных комбинаций - PullRequest
0 голосов
/ 20 января 2020

Я начал изучать 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:

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

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

То, что я хотел бы получить, это общий объем продаж за каждый год, а также процентное изменение по сравнению с прошлым годом. Все это для всех возможных комбинаций отдела_дес c и типа_дес c. Я попробовал это с помощью следующего кода, но, похоже, проблема с 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

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

1 Ответ

0 голосов
/ 20 января 2020

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

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, потому что мне хотелось бы быть откровенным о полученных результатах.)

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