将 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;
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
我有一个 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;
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