在项目中遇到一个需求,需要我们使用动态行转列的方法,大家都知道在MySQL中是没有像Oracle那样的专门来做行转列的函数,所以我们在这个需求里面就是用的使用脚本生成动态sql这种方式,我们这个查询又使用mybatis去调用,所以我们使用的是存储过程这种方式,下面贴上sql,如果有问题,请麻烦指教一下。
CREATE DEFINER=`test`@`%` PROCEDURE `NewDefectNum`(startDate varchar(30),endDate varchar(30),startPage VARCHAR(2),pageNum VARCHAR(8))
BEGIN
#Routine body goes here...
-- SELECT * from (
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(a.month = ''',
a.month,
''', a.defect, 0)) AS ''',
RIGHT(a.month,2), ''''
)
) INTO @sql
FROM z_test a WHERE MONTH >= startDate AND MONTH <= endDate ORDER BY RIGHT(endDate,2) desc ;
SET @sql = CONCAT('Select name,code,', @sql,
CONCAT(CONCAT(CONCAT( CONCAT(' From z_test a WHERE MONTH >=', startDate),' AND MONTH <='),endDate),' Group by a.name,a.code ')
);
SET @sql =CONCAT(CONCAT( CONCAT( CONCAT(CONCAT( CONCAT(CONCAT(' SELECT * from( ',@sql),') aa ORDER BY aa.'), RIGHT(endDate,2)),' DESC LIMIT '),startPage),','),pageNum);
PREPARE stmt FROM @sql;
-- SELECT @sql FROM dual;
-- 动态生成脚本
EXECUTE stmt; -- 动态执行脚本
END