最近,在做一个行转列的存储过程,遇到一个问题,问题如下:
我用group_concat()函数 来整合一个月每天的操作量,并将每天的操作量用CONCAT()函数拼接成 “MAX(IF(t.a = \'2017-11-01\', t.s, 0))”格式,最后用group_concat()函数来拼接。
代码如下:
SELECT @sql:= GROUP_CONCAT( CONCAT( \'MAX(IF(t1.op_date=\\'\', t1.op_date, \'\\'\',\',t1.op_sum,0)) AS\\'opt\', day(dt), \'\\'\' )) , @str:= GROUP_CONCAT(CONCAT(\'MAX(IF(t1.op_date=\\'\', t1.op_date,\'\\'\',\',t1.day_sal,0)) AS\\'sal\', day(dt), \'\\'\')), t1.staf_no, t1.fb_code FROM tableName AS t1 WHERE t1.fb_code = 100088 AND t1.op_date BETWEEN "2017-08-01" AND LAST_DAY("2017-08-01") GROUP BY t1.fb_code,t1.staf_no
执行结果如下:
执行结果中,有四条记录超过了1kb,实际上这四条记录已经超过1kb了,只是系统自动截取了字符串而已。
具体的字符串显示:
MAX(IF(t1.op_date=\'2017-08-29\',t1.op_sum,0)) AS\'opt29\', MAX(IF(t1.op_date=\'2017-08-06\',t1.op_sum,0)) AS\'opt6\', MAX(IF(t1.op_date=\'2017-08-24\',t1.op_sum,0)) AS\'opt24\', MAX(IF(t1.op_date=\'2017-08-01\',t1.op_sum,0)) AS\'opt1\', MAX(IF(t1.op_date=\'2017-08-19\',t1.op_sum,0)) AS\'opt19\', MAX(IF(t1.op_date=\'2017-08-14\',t1.op_sum,0)) AS\'opt14\', MAX(IF(t1.op_date=\'2017-08-09\',t1.op_sum,0)) AS\'opt9\', MAX(IF(t1.op_date=\'2017-08-27\',t1.op_sum,0)) AS\'opt27\', MAX(IF(t1.op_date=\'2017-08-04\',t1.op_sum,0)) AS\'opt4\', MAX(IF(t1.op_date=\'2017-08-22\',t1.op_sum,0)) AS\'opt22\', MAX(IF(t1.op_date=\'2017-08-17\',t1.op_sum,0)) AS\'opt17\', MAX(IF(t1.op_date=\'2017-08-12\',t1.op_sum,0)) AS\'opt12\', MAX(IF(t1.op_date=\'2017-08-30\',t1.op_sum,0)) AS\'opt30\', MAX(IF(t1.op_date=\'2017-08-07\',t1.op_sum,0)) AS\'opt7\', MAX(IF(t1.op_date=\'2017-08-25\',t1.op_sum,0)) AS\'opt25\', MAX(IF(t1.op_date=\'2017-08-02\',t1.op_sum,0)) AS\'opt2\', MAX(IF(t1.op_date=\'2017-08-20\',t1.op_sum,0)) AS\'opt20\', MAX(IF(t1.op_date=\'2017-08-15\',t1.op_sum,0)) AS\'opt15\', MAX(IF(t1.op_date=\'2017-08-10\',t1.op_sum
可以看到最后的结果中,超过ikb ,MYSQL数据库会自动进行截取。为此本人查阅了很多资料,但是无果。通过自己的尝试,总算解决了问题。
解决方法: 将将每天的操作量用CONCAT()函数合并到最简,如下:
GROUP_CONCAT( CONCAT( \'MAX(IF(m.a=\\'\', day(t.op_date), \'\\'\',\',m.p,0)) \\'n\', day(dt), \'\\'\' ) )
结果如下:
MAX(IF(m.a=\'27\',m.p,0)) \'n27\',MAX(IF(m.a=\'16\',m.p,0)) \'n16\', MAX(IF(m.a=\'5\',m.p,0)) \'n5\',MAX(IF(m.a=\'26\',m.p,0)) \'n26\', MAX(IF(m.a=\'15\',m.p,0)) \'n15\',MAX(IF(m.a=\'4\',m.p,0)) \'n4\', MAX(IF(m.a=\'25\',m.p,0)) \'n25\',MAX(IF(m.a=\'14\',m.p,0)) \'n14\', MAX(IF(m.a=\'3\',m.p,0)) \'n3\',MAX(IF(m.a=\'24\',m.p,0)) \'n24\', MAX(IF(m.a=\'13\',m.p,0)) \'n13\',MAX(IF(m.a=\'2\',m.p,0)) \'n2\', MAX(IF(m.a=\'23\',m.p,0)) \'n23\',MAX(IF(m.a=\'12\',m.p,0)) \'n12\', MAX(IF(m.a=\'1\',m.p,0)) \'n1\',MAX(IF(m.a=\'22\',m.p,0)) \'n22\', MAX(IF(m.a=\'11\',m.p,0)) \'n11\',MAX(IF(m.a=\'21\',m.p,0)) \'n21\', MAX(IF(m.a=\'10\',m.p,0)) \'n10\',MAX(IF(m.a=\'31\',m.p,0)) \'n31\', MAX(IF(m.a=\'20\',m.p,0)) \'n20\',MAX(IF(m.a=\'9\',m.p,0)) \'n9\', MAX(IF(m.a=\'30\',m.p,0)) \'n30\',MAX(IF(m.a=\'19\',m.p,0)) \'n19\', MAX(IF(m.a=\'8\',m.p,0)) \'n8\',MAX(IF(m.a=\'29\',m.p,0)) \'n29\', MAX(IF(m.a=\'18\',m.p,0)) \'n18\',MAX(IF(m.a=\'7\',m.p,0)) \'n7\', MAX(IF(m.a=\'28\',m.p,0)) \'n28\',MAX(IF(m.a=\'17\',m.p,0)) \'n17\',MAX(IF(m.a=\'6\',m.p,0)) \'n6\'
结果显而易见,压缩后,整个月的信息都被显示出来了
总结:最后,强调一下group_concat() 函数,合并字符串不能超过1kb ,否则,系统会自动截取超长的字符串,在进行别的操作就会报错了。