Артикулы по статусу сверки в категориях, вымышленный мебельный магазин
SQL, по которому посчитано
WITH sales_12m AS (
SELECT
sku,
MIN(category) AS category,
SUM(units - returned_units) AS sold_units
FROM sales
WHERE date >= (
SELECT date_trunc('month', MAX(date)) - INTERVAL '11 months'
FROM sales
)
GROUP BY sku
),
stock_latest AS (
SELECT
sku,
MIN(category) AS category,
SUM(units) AS stock_units
FROM stock
WHERE date = (SELECT MAX(date) FROM stock)
GROUP BY sku
),
sku_check AS (
SELECT
COALESCE(s.sku, st.sku) AS sku,
COALESCE(s.category, st.category) AS category,
COALESCE(s.sold_units, 0) AS sold_units,
COALESCE(st.stock_units, 0) AS stock_units,
CASE
WHEN COALESCE(s.sold_units, 0) > 0 AND COALESCE(st.stock_units, 0) = 0 THEN 'Продажи без остатка'
WHEN COALESCE(s.sold_units, 0) = 0 AND COALESCE(st.stock_units, 0) > 0 THEN 'Остаток без продаж'
ELSE 'Есть и продажи, и остаток'
END AS status
FROM sales_12m s
FULL OUTER JOIN stock_latest st ON s.sku = st.sku
)
SELECT
category,
status,
COUNT(*) AS sku_count
FROM sku_check
GROUP BY category, status
ORDER BY category, status
LIMIT 30