Создать сводную таблицу с использованием PostgreSQL - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть такая таблица:

type    code    desc    store  Sales/Day  Stock
-----------------------------------------------
1       AA1     abc     101        3        6
1       AA2     abd     101        4        0
1       AA3     abf     101        4        3
2       BA1     bba     101        5        1
2       BA2     bbc     101        2        1
1       AA1     abc     102        1        4
1       AA2     abd     102        2        0
2       BA1     bba     102        4        2
2       BA2     bbc     102        5        5
etc.

Как я могу показать таблицу результатов следующим образом:

type    code    desc         Store 101             Store 102
                        Sales/Day | Stock    Sales/Day | Stock
--------------------------------------------------------------
1       AA1     abc        3          6         1          4
1       AA2     abd        4          0         2          0
1       AA3     abf        4          3         0          0
2       BA1     bba        5          1         4          2
2       BA2     bbc        2          1         5          5
etc.

Примечание: Colspan это только дисплей.

1 Ответ

0 голосов
/ 01 ноября 2018

демо: дб <> скрипка

Первый путь: 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. Поэтому я настоятельно рекомендую переименовать вашу колонку.

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