Сводная таблица SQL в N столбцов - PullRequest
1 голос
/ 21 ноября 2019

У меня есть таблица t1 с 3 столбцами, показывающими количество проданных продуктов в день, продукты в таблице динамические, новые продукты добавляются в таблицу позже (A, B, C, ...). Мне нужно повернуть таблицу t1 до {date, количество проданного продукта A, количество проданного продукта B, количество проданного продукта C и т. Д.}

Я могу написать запрос сутверждение случая, если продукты являются фиксированными, то есть случаи A, B, C, но мне нужно динамическое решение.

---------------
-- INPUT DATA
-- table t1
-- date     product_name   quantity_sold
-- 1/1/2013    A           100
-- 1/1/2013    B           200
-- 1/1/2013    C           300
-- 1/2/2013    A           101
-- 1/2/2013    C           301
-- 1/3/2013    A           102
-- 1/3/2013    B           202
-- 1/3/2013    C           302


-- DESIRED OUTPUT
-- date     qty_prod_a  qty_prod_b  qty_prod_c
-- 1/1/2013  100        200         300
-- 1/2/2013  101        0           301
-- 1/3/2013  102        202         302

Ответы [ 2 ]

2 голосов
/ 21 ноября 2019

Как прокомментировал P.Salmon, для этого вам нужен динамический sql. Это означает динамическое построение строки запроса, а затем ее выполнение.

Вот типичное решение:

set @q = null;
select
    group_concat(distinct
        concat(
            'sum(case when product_name = ''', 
            product_name, 
            ''' then quantity_sold else 0 end) as `qty_prod_', 
            lower(product_name),
            '`'
        )
) into @q
from t1;

set @q = concat(
    'select 
        date,
        ', @q, '
    from t1
    group by date
    order by date'
);

prepare stmt from @q;
execute stmt;
deallocate prepare stmt;

Демонстрация на DB Fiddle :

date       | qty_prod_a | qty_prod_b | qty_prod_c
:--------- | ---------: | ---------: | ---------:
2013-01-01 |        100 |        200 |        300
2013-01-02 |        101 |          0 |        301
2013-01-03 |        102 |        202 |        302
1 голос
/ 21 ноября 2019

Не думаю, что было бы неплохо иметь динамическое число столбцов.

Вместо этого попробуйте сгруппировать и суммировать исходные данные.

select date, product_name, sum(quantity_sold) 
from t1 
group by date, product_name;

Это на самом деле не дастВы - сводная таблица, но это путь с SQL, IMHO.

...