天天看點

Oracle實作豎表轉橫表的幾種常用方法(行轉列)

有能耗表,記錄各個城市水、電、熱的能耗情況,表結構如下:

表結構

名稱 類型 備注
E_CODE VARCHAR2(10) 城市的CODE
E_VALUE NUMBER 能耗值,包括水耗、電耗、熱耗
E_TIME VARCHAR2(20) 時間
E_TYPE NUMBER 能耗類型,0:水耗,1:電耗,2:熱耗

插入測試資料,如下:

表資料

E_CODE E_VALUE E_TIME E_TYPE
BJ 20.05 2018-08-29 01:00:00
BJ 36.35 2018-08-29 01:00:00 1
BJ 45.223 2018-08-29 01:00:00 2
SH 22.95 2018-08-29 01:00:00
SH 18.4556 2018-08-29 01:00:00 1
SH 33.254 2018-08-29 01:00:00 2
GZ 48.554 2018-08-29 01:00:00
GZ 21.112 2018-08-29 01:00:00 1
GZ 25.625 2018-08-29 01:00:00 2

上面的表格是一張豎表,而我們想得到的是橫表,即行轉列,獲得如下結果

編号 時間 水耗 電耗 熱耗
SH 2018-08-29 01:00:00 22.95 18.4556 33.254
GZ 2018-08-29 01:00:00 48.554 21.112 25.625
BJ 2018-08-29 01:00:00 20.05 36.35 45.223

實作豎表轉橫表的查詢,即行轉列,通常有兩種常用方法。

第一種:使用decode實作

SELECT
	E_CODE,
	E_TIME,
	SUM( DECODE(E_TYPE, 0, E_VALUE) ) AS WATER_ENERGY,--水耗
	SUM( DECODE(E_TYPE, 1, E_VALUE) ) AS ELE_ENERGY,--電耗
	SUM( DECODE(E_TYPE, 2, E_VALUE) ) AS HEAT_ENERGY--熱耗
FROM
	THTF_ENERGY_TEST
GROUP BY 
	E_CODE,E_TIME
           

 輸出如下:

E_CODE E_TIME WATER_ENERGY ELE_ENERGY HEAT_ENERGY
SH 2018-08-29 00:00:00 22.95 18.4456 33.2540
GZ 2018-08-29 00:00:00 48.5540 21.1120 25.6250
BJ 2018-08-29 00:00:00 20.05 36.35 45.2230

第二種:使用case when實作

簡單case when函數:

SELECT
	E_CODE,
	E_TIME,
	SUM( CASE E_TYPE WHEN 0 THEN E_VALUE ELSE 0 END ) AS WATER_ENERGY,--水耗
	SUM( CASE E_TYPE WHEN 1 THEN E_VALUE ELSE 0 END ) AS ELE_ENERGY,--電耗
	SUM( CASE E_TYPE WHEN 2 THEN E_VALUE ELSE 0 END ) AS HEAT_ENERGGY--熱耗
FROM
	THTF_ENERGY_TEST
GROUP BY 
	E_CODE,E_TIME
           

輸出結果同上:

E_CODE E_TIME WATER_ENERGY ELE_ENERGY HEAT_ENERGY
SH 2018-08-29 00:00:00 22.95 18.4456 33.2540
GZ 2018-08-29 00:00:00 48.5540 21.1120 25.6250
BJ 2018-08-29 00:00:00 20.05 36.35 45.2230

CASE WHEN函數功能很強大、實用,使用起來也簡單易懂。在此篇文章詳細介紹:CASE WHEN 用法詳解