Alexander_89

Test_Sportmaster

Apr 30th, 2023
749
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 1.80 KB | None | 0 0
  1. -- создаём таблицу, вносим в неё значения (в реальной ситуации шаг не нужен, так как делается запрос к базе)
  2. /*create table tab(
  3.   week_end VARCHAR(30),
  4.   category VARCHAR(30),
  5.   out_of_stock FLOAT,
  6.   delivery_lag FLOAT,
  7.   product_deficit FLOAT,
  8.   nostock FLOAT,
  9.   other FLOAT);
  10. INSERT INTO tab VALUES ('23.01.2022', 'Equipment', 0.24, 0.02, 0.04, 0.07, 0.11),
  11. ('23.01.2022', 'Shoes', 0.14, 0.04, 0.04, 0.03, 0.03),
  12. ('23.01.2022', 'Clothing', 0.16, 0.03, 0.05, 0.06, 0.02);*/
  13. -- "разбиваем" сводную таблицу
  14. WITH t3 AS (
  15.     SELECT t1.week_end, t1.category, t1.out_of_stock, t2.*
  16.     FROM tab AS t1
  17.         cross join lateral (
  18.              VALUES
  19.              (t1.delivery_lag, 'delivery_lag'),
  20.              (t1.product_deficit, 'product_deficit'),
  21.              (t1.nostock, 'nostock'),
  22.              (t1.other, 'other')
  23.         ) AS t2(d, cause1)
  24. ),
  25. -- с помощью оконной функции присваиваем ранги (окно по категории, сортировка по значению доли нехватки товара по убыванию)
  26. t4 AS (
  27.     SELECT *, DENSE_RANK() OVER(PARTITION BY category ORDER BY d DESC) AS r
  28.     FROM t3
  29. ),
  30. -- оставляем только строки с рангом 1 - это максимум
  31. t5 AS (
  32.     SELECT *
  33.     FROM t4
  34.     WHERE r=1
  35. ),
  36. -- объединяем столбцы с причиной и значением доли
  37. t6 AS (
  38.   SELECT week_end, category, out_of_stock, cause1||' ('||d||')' AS cause2
  39.   FROM t5
  40. )
  41. -- делаем группировку, чтобы для одной категории была одна строка
  42. SELECT week_end, category, out_of_stock, STRING_AGG(cause2, ', ') AS cause
  43. FROM t6
  44. GROUP BY week_end, category, out_of_stock
Advertisement
Add Comment
Please, Sign In to add comment