今天有个同事,让我替他写一个SQL,将返回的行数据,拉直了,变成列来显示, 而且列的数目是不确定的。好像报表经常用到这个功能啊。
数据库是MYSQL的,不熟悉,于是花了点时间研究一下。
这个需求,在SQLSERVER里面有个PIVOT函数,在ORACLE11g中,也加了这个。
因为不知道MYSQ L的匿名块怎么写,语法也不熟悉,就分步执行了。
第一步: 找出有哪些列需要显示。
select concat(' round(num(case when CPS=',c.CPS,' then aa.SuccessRate else null end), 4) CPS', c.CPS, ', ') newcol from (select distinct b.CPS from table_a b where b.TASNum = 2) c order by c.CPS;
第二步: 拼装出完整的SQL语句。
select
aa.version,
round(num (case when CPS=10 then aa.SuccessRate else null end), 4) CPS10,
*
*
*
from (select Concat(Concat(a.Version, ' '), a.Comments) Version, a.CPS CPS, a.SuccessRate SuccessRate
from table_a a
where a.TASNum = 2
order by version, CPS) aa
group by aa.Version;
将中间的那些××,用第一步查询的返回值代替就可以。
第三步: 执行。(或者在EXCEL里面设置一下,把这个sql语句存起来,由excel调用,自动生成报表。)