最近,在做一个行转列的存储过程,遇到一个问题,问题如下:
我用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 ,否则,系统会自动截取超长的字符串,在进行别的操作就会报错了。