有能耗表,記錄各個城市水、電、熱的能耗情況,表結構如下:
名稱 | 類型 | 備注 |
---|---|---|
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 用法詳解