0

我有一个简单的数据库(使用 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 | ... |

我在让这份报告工作时遇到了一些麻烦。我的主要障碍是增加了周数,因此报告的列数会有所不同。

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

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

用户表:

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

2 回答 2

0

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

于 2013-02-07T17:42:03.760 回答
0

您的表结构并不完全清楚(例如,我看不到您从哪里得到user name)。

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

于 2013-02-07T17:48:20.500 回答