【问题】
原sql如下:select day,registerCount,loginCount
from(
select day from date where day between 20120101 and 20120103)tmp
left join(
select registerCount from register)r on tmp.day=r.day
left join(
select loginCount from login)l on tmp.day=l.day
group by day;
原结果集如下:

想更改为如下结果:

水平有限,请高手搭救,要详细sql
【回答】
数据转置的问题,用Oracle的pivot关键字实现起来比较方便,但Mysql等其他数据库没有提供,硬拼的写法不容易理解和维护,也难以实现动态列的效果。可以采用集算器来做,SPL脚本如下:
| A | |
| 1 | $select day,registerCount,loginCount from… |
| 2 | =A1.pivot@r(day;类别,count) |
| 3 | =A2.pivot(类别;day,count) |
A1:问题里的原sql
A2:对A1列转行,将registerCount,loginCount转换为类别列的字段值,结果如下:

A3:对A2行转列,将day字段值的唯一值转换为列名

写好的脚本,可以通过集算器JDBC与其他应用集成,可参考Java 如何调用 SPL 脚本
博客内容涉及SQL查询操作,原始SQL旨在选取特定日期范围内的注册和登录计数,并通过LEFT JOIN进行数据聚合。然而,需求变为将结果集进行行列转换。由于MySQL不支持Oracle的PIVOT关键字,解决方案建议使用集算器SPL,它提供了更简洁的转置方法。SPL脚本通过两步操作实现了所需的结果,首先列转行,然后行转列,使得数据格式符合新的需求。
686

被折叠的 条评论
为什么被折叠?



