其实列转行是比较简单的用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
内存数据库中列转行的应用,h2中列转行,hsqldb中列转行,布布扣,bubuko.com