MySQL技巧>>行转列用法

背景介绍

最近有很多报表需求。刚好使用了可以基于 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 ( );

验证结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值