wll-cs

最近,在做一个行转列的存储过程,遇到一个问题,问题如下:

   我用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 ,否则,系统会自动截取超长的字符串,在进行别的操作就会报错了。

 

分类:

技术点:

相关文章: