【问题标题】:Switch rows to columns to generate report - MySql将行切换到列以生成报告 - MySql
【发布时间】:2013-02-07 17:37:16
【问题描述】:

我有一个简单的数据库(使用 MySql),我需要用它来生成报告。

我有一个表,其中包含用户提交的每周日志。这些日志中的每一个都有状态,例如:已提交、已批准等。

日志提交表 +----+--------+--------+---------+--------+ |编号 |周ID |用户名 |信息... |状态 | +----+--------+--------+---------+--------+ | 0 | 0 | 1 |数据... | 0 | | 1 | 0 | 2 |数据... | 1 | | 1 | 0 | 3 |数据... | 1 | | 2 | 1 | 1 |数据... | 0 |

我还有一张记录周数的表格。

WeekManager 表 +----+------------+---------+---------+ |编号 |开始日期 |结束日期 | ... | +----+------------+---------+---------+ | 0 |日期1 |日期2 | ... | | 1 |日期3 |日期4 | ... | | 2 |日期5 |日期6 | ... |

我需要一份报告,将周显示为列以及用户表中的名称。它应该显示用户提交的每周日志的状态。例如,第 1 周的 Bob 提交的状态为 0。

报告 +--------+--------+--------+--------+--------+ |姓名 |第 1 周 |第 2 周 |第 3 周 | ... | +--------+--------+--------+--------+--------+ |鲍勃 | 0 | 1 | 0 | ... | |乔 | 1 | 1 | 1 | ... | |吉姆 | 0 | 0 | 0 | ... |

我在处理此报告时遇到了一些问题。我的主要障碍是增加了周数,因此报告的列数会有所不同。

这个here 帮助很大,但它只处理静态数量的行。我需要一些根据周数而变化的东西。我正在考虑使用某种循环来实现这一点,但是我不确定这是否可能。

任何帮助将不胜感激,谢谢。

用户表:

用户表 +----+------+---------+ |编号 |姓名 | ... | +----+------+---------+ | 0 | ... | ... | | 1 | ... | ... | | 2 | ... | ... |

【问题讨论】:

    标签: mysql report


    【解决方案1】:

    你的表结构不是很清楚(例如我看不到你从哪里得到user name)。

    pivot 在 MySQL 中的基本设置使用一个聚合函数和一个类似于此的 CASE 表达式:

    select 
      l.userid,
      max(case when w.id =0 then l.state end) Week1,
      max(case when w.id =1 then l.state end) Week2,
      max(case when w.id =2 then l.state end) Week3
    from LogSubmissions l
    left join WeekManager w
      on w.id = l.weekid
    group by l.userid
    

    SQL Fiddle with Demo

    编辑,如果你的周数未知,那么你可以使用准备好的语句来生成动态 sql:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'max(case when w.id = ',
          id,
          ' then l.state end) AS Week',
          id + 1
        )
      ) INTO @sql
    FROM  WeekManager;
    
    SET @sql = CONCAT('SELECT l.userid, ', @sql, ' 
                      from LogSubmissions l
                      left join WeekManager w
                        on w.id = l.weekid
                      group by l.userid');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    SQL Fiddle with Demo

    【讨论】:

    • 感谢您的帮助。但是将添加周数,我需要一个查询,该查询将根据周数创建列。
    • @computer10171 查看我的编辑,我包含了未知数据的动态版本。
    • 非常感谢,正是我需要的。
    • @computer10171 很乐意为您提供帮助。 :)
    【解决方案2】:

    听起来您正在尝试将水平表转换为垂直表(如果您愿意,可以使用临时表)。使用 union all 按照上一篇文章执行此操作:SQL query ; horizontal to vertical

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 1970-01-01
      • 2011-03-02
      • 2012-12-07
      • 2023-03-21
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多