Oracle SQL重新格式化表

Oracle SQL重新格式化表,sql,oracle12c,Sql,Oracle12c,我有一张这样的桌子: COMPANY ZONE SITE DATE KWHTOTAL KWHIT KWHCLIMA 1 0 11 01/01/2018 10000 5000 3000 2 0 23 01/02/2018 7000 4000 1500 ... 我需要把桌子换成这个 COMPANY ZONE SITE DATE

我有一张这样的桌子:

COMPANY    ZONE    SITE    DATE    KWHTOTAL    KWHIT    KWHCLIMA
   1        0       11  01/01/2018  10000      5000      3000
   2        0       23  01/02/2018  7000       4000      1500
...
我需要把桌子换成这个

COMPANY    ZONE    SITE    DATE       KWH    TYPE
   1        0       11   01/01/2018  10000   KWHTOTAL
   1        0       11   01/01/2018  5000    KWHIT
   1        0       11   01/01/2018  3000    KWHCLIMA
   2        0       23   01/02/2018  7000    KWHTOTAL
   2        0       23   01/02/2018  4000    KWHIT
   2        0       23   01/02/2018  1500    KWHCLIMA


感谢您的帮助

一种方法是使用
union all
。但是,Oracle 12c支持横向联接。因此,您可以:

select t.COMPANY, t.ZONE, t.SITE, t.DATE, tt.KWH, tt.TYPE
from t cross apply
     (select 'KWHTOTAL' as type, KWHTOTAL as kwh from dual union all
      select 'KWHIT' as type, KWHIT as kwh from dual union all
      select 'KWHCLIMA' as type, KWHCLIMA as kwh from dual
     ) tt;

一种方法是使用
union all
。但是,Oracle 12c支持横向联接。因此,您可以:

select t.COMPANY, t.ZONE, t.SITE, t.DATE, tt.KWH, tt.TYPE
from t cross apply
     (select 'KWHTOTAL' as type, KWHTOTAL as kwh from dual union all
      select 'KWHIT' as type, KWHIT as kwh from dual union all
      select 'KWHCLIMA' as type, KWHCLIMA as kwh from dual
     ) tt;

您可以尝试使用
UNPIVOT
,Oracle
12c
应支持此功能:

SELECT *
FROM your_table
UNPIVOT (KWH FOR kwh_field IN (KWHTOTAL AS 'KWHTOTAL', KWHIT AS 'KWHIT',
    KWHCLIMA AS 'KWHCLIMA'))

您可以尝试使用
UNPIVOT
,Oracle
12c
应支持此功能:

SELECT *
FROM your_table
UNPIVOT (KWH FOR kwh_field IN (KWHTOTAL AS 'KWHTOTAL', KWHIT AS 'KWHIT',
    KWHCLIMA AS 'KWHCLIMA'))

谢谢你的帮助!谢谢你的帮助!谢谢你的帮助!。我选择了你的方法,它花费的时间更少。谢谢你的帮助!。我选择你的方法,它花费的时间更少。