将 SQL table 旋转到 N 列

Pivot SQL table to N columns

我有一个 table t1,有 3 列显示每天每种产品的销售量,table 中的产品是动态的,table 稍后添加新产品(A ,B,C, ...)。 我需要将 table t1 转换为{日期、产品 A 的销售数量、产品 B 的销售数量、产品 C 的销售数量,等等。}

如果产品是固定的,我可以写一个带有case语句的查询,即case 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

我认为对列进行动态计数不是个好主意。

改为尝试对原始数据进行分组和求和。

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

这实际上不会给你一个旋转的 table,但这是 SQL 的方式,恕我直言。

正如 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;

Demo on 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