最近,在做一個行轉列的存儲過程,遇到一個問題,問題如下:
我用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 ,否則,系統會自動截取超長的字符串,在進行別的操作就會報錯了。