背景介绍
最近有很多报表需求。刚好使用了可以基于 SQL 实现的 报表插件。
需求要求展示如下。 则刚好用到了行转列技术
原始数据示例
技能列表&开发代码
#MySQL中不能在一个存储过程中删除另一个存储过程
#DROP PROCEDURE IF EXISTS sp_count();
DELIMITER &&
CREATE PROCEDURE sp_count_whsdyyy ( ) BEGIN
# 动态生成列,列的变量
DECLARE
day_time VARCHAR ( 20 );
# 声明循环长度的变量
DECLARE
count INT;
# 计数器
DECLARE
i INT DEFAULT 0;
# 计算每个日期需要循环的总次数
SET count = ( SELECT COUNT( DISTINCT dayTime ) FROM whsdyyy_doctor_every_day_num );
# SQL头,用于拼接 SQL
SET @s = 'SELECT doctor_name , dept_name ';
WHILE
i < count DO
# 定义列的维度 ,动态转换列
SET day_time = ( SELECT dayTime FROM whsdyyy_doctor_every_day_num GROUP BY dayTime ORDER BY dayTime LIMIT i, 1 );
# 拼接 SQL
SET @s = CONCAT( @s, ',SUM(CASE dayTime WHEN ', '\'', day_time, '\'', ' THEN orderNumEveryDay END )', ' AS ', '\'', day_time, '\'' );
# 累计循环
SET i = i + 1;
END WHILE;
SET @s = CONCAT( @s, ',sum(orderNumEveryDay) as 总分 FROM whsdyyy_doctor_every_day_num GROUP BY doctor_name' );
PREPARE stmt
FROM
@s;
EXECUTE stmt;
END && CALL sp_count_whsdyyy ( );