内存数据库中列转行的应用,h2中列转行,hsqldb中列转行
其实列转行是比较简单的用sum和decode函数就可以了,但是我遇到的项目,不知道数据谁设计的居然字段里面还设计成long类型,此long类型与java中的不同,oracle中的long是指可变长二进制数据,最长2G,哎没办法只好转换了。
以下是hsqldb的转换,用到了转换函数convert,可以将long类型的转换为double类型,其中d.value是long类型,status是int类型,所以value需要转换
SELECT P.NAME,P.ID,
SUM(DECODE(D.K_NAME,‘a‘,convert(d.value,SQL_DOUBLE),NULL)) AS a1,
SUM(DECODE(D.K_NAME,‘a‘,convert(d.value,SQL_DOUBLE),NULL)) AS b1,
SUM(DECODE(D.K_NAME,‘a‘,D.STATUS,NULL)) AS a1_status,
SUM(DECODE(D.K_NAME,‘a‘,D.STATUS,NULL)) AS b1_status
FROM
P LEFT JOIN
D ON P.ID=D.id
WHERE a IN (‘a‘,‘b‘)
GROUP BY P.NAME,P.ID
ORDER BY decode(a,null,0,a) DESC LIMIT 0,10
h2是内存数据库,跟hsqldb类似,但是性能好像没有hsqldb稳定
SELECT P.NAME,P.ID,
SUM(DECODE(D.K_NAME,‘a‘,convert(d.value,number),NULL)) AS a1,
SUM(DECODE(D.K_NAME,‘a‘,convert(d.value,number),NULL)) AS b1,
SUM(DECODE(D.K_NAME,‘a‘,D.STATUS,NULL)) AS a1_status,
SUM(DECODE(D.K_NAME,‘a‘,D.STATUS,NULL)) AS b1_status
FROM
P LEFT JOIN
D ON P.ID=D.id
WHERE a IN (‘a‘,‘b‘)
GROUP BY P.NAME,P.ID
ORDER BY decode(a,null,0,a) DESC LIMIT 0,10
本文出自 “努力的蜗牛” 博客,请务必保留此出处http://newhouse2000.blog.51cto.com/4355310/1536108
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。