方法一: Oracle行转列pivot函数
语法:pivot(任一聚合函数 for 需要转列的值所在列名 in (需转为列名的值))
原数据格式如下:
SELECT
rspfd.FORECAST_YEAR , --年份
rspfd.INDEX_CODE , --指标代码
rspfd.INDEX_VALUE --指标值
FROM RPT_STK_PROFIT_FORECAST_DATA rspfd
WHERE rspfd.FORECAST_ID = 111
行转列pivot函数
--行转列
select
*
from
(SELECT
rspfd.FORECAST_YEAR , --年份
rspfd.INDEX_CODE , --指标代码
rspfd.INDEX_VALUE --指标值
FROM RPT_STK_PROFIT_FORECAST_DATA rspfd
WHERE rspfd.FORECAST_ID = 250717)
pivot(
max(INDEX_VALUE) for INDEX_CODE in ( --INDEX_CODE 即要转成列的字段
'1000001' as INDEX_O1, --max(INDEX_VALUE) 此处必须为聚合函数,
'1000003' as INDEX_O2, --in () 对要转成列的每一个值指定一个列名
'1000008' as INDEX_O3,
'1000009' as INDEX_O4
)
);
方法二:使用MAX DECODE 实现
SELECT
T.FORECAST_YEAR,
max(decode(T.INDEX_CODE,'1000001',T.INDEX_VALUE,'')) AS INDEX_O1,
max(decode(T.INDEX_CODE,'1000003',T.INDEX_VALUE,'')) AS INDEX_O2,
max(decode(T.INDEX_CODE,'1000008',T.INDEX_VALUE,'')) AS INDEX_O3,
max(decode(T.INDEX_CODE,'1000009',T.INDEX_VALUE,'')) AS INDEX_O4
FROM (
SELECT
rspfd.FORECAST_YEAR , --年份
rspfd.INDEX_CODE , --指标代码
rspfd.INDEX_VALUE --指标值
FROM RPT_STK_PROFIT_FORECAST_DATA rspfd
WHERE rspfd.FORECAST_ID = 111) T GROUP BY T.FORECAST_YEAR;