【问题标题】:Pivot SQL table to N columns将 SQL 表透视到 N 列
【发布时间】:2019-11-21 08:35:59
【问题描述】:

我有一个表 t1,其中 3 列显示每个产品每天销售的数量,表中的产品是动态的,稍后会在表中添加新产品(A、B、C、...)。 我需要将表 t1 旋转为{日期,产品 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

【问题讨论】:

标签: mysql sql group-by pivot dynamic-sql


【解决方案1】:

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

日期 |数量_prod_a |数量_prod_b |数量_prod_c :--------- | ---------: | ---------: | ---------: 2013-01-01 | 100 | 200 | 300 2013-01-02 | 101 | 0 | 301 2013-01-03 | 102 | 202 | 302

【讨论】:

  • 这太难了...确保您的产品名称不包含空格或单引号。这基本上会把事情搞砸。如果您的产品数量太大,您也可能会遇到问题。虽然此解决方案可能适用于测试数据,但我强烈建议不要将其用于生产代码。
  • @JochenReinhardt:据我了解,动态 SQL 实际上是 OP 要求的。我建议您最好对问题本身发表评论,而不是对就所需内容提供正确技术的答案投反对票。
  • 您建议的解决方案存在一些缺陷。因此投反对票。您的连接会为 prod aGMB's 等产品名称创建不正确的结果
  • 动态查询背后的想法是执行数据分析和数据可视化。 @JochenReinhard 是的,即使我不建议在生产环境中使用它
【解决方案2】:

我认为动态计算列数不是一个好主意。

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

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

这实际上不会给你一个透视表,但这是使用 SQL 的方式,恕我直言。

【讨论】:

  • 是的,Jochen group by 是优化&sql的方式,我已经知道了,我特意找动态解决方案。
  • 我怀疑动态解决方案是个好主意。请参阅我对另一个答案的评论。
猜你喜欢
  • 2023-03-29
  • 2021-12-27
  • 2021-01-21
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2019-05-08
相关资源
最近更新 更多