демо: дб <> скрипка
Первый путь: FILTER
SELECT
type,
code,
"desc",
COALESCE(SUM(sales_day) FILTER (WHERE store = 101)) as sales_day_101,
COALESCE(SUM(stock) FILTER (WHERE store = 101), 0) as stock_101,
COALESCE(SUM(sales_day) FILTER (WHERE store = 102), 0) as sales_day_102,
COALESCE(SUM(stock) FILTER (WHERE store = 102), 0) as stock_102
FROM mytable
GROUP BY type, code, "desc"
ORDER BY type, code
Агрегирование ваших ценностей. Я взял SUM
, но в вашем случае с отдельными строками это сделали бы многие другие агрегатные функции. FILTER
позволяет агрегировать только один магазин.
COALESCE
- избегать значений NULL, если для одной агрегации отсутствуют значения (например, AA3
в хранилище 102
).
Второй способ, CASE WHEN
SELECT
type,
code,
"desc",
SUM(CASE WHEN store = 101 THEN sales_day ELSE 0 END) as sales_day_101,
SUM(CASE WHEN store = 101 THEN stock ELSE 0 END) as stock_101,
SUM(CASE WHEN store = 102 THEN sales_day ELSE 0 END) as sales_day_102,
SUM(CASE WHEN store = 102 THEN stock ELSE 0 END) as stock_102
FROM mytable
GROUP BY type, code, "desc"
ORDER BY type, code
Идея та же, но более новая функция FILTER
заменена более распространенным предложением CASE
.
Обратите внимание , что "desc" является зарезервированным словом в Postgres. Поэтому я настоятельно рекомендую переименовать вашу колонку.