Oracle SQL数据透视转换

Oracle SQL数据透视转换,sql,oracle,pivot,Sql,Oracle,Pivot,我的表格如下: SNF SFCM POOL QUOTA a US eng 11 a US sud 20 b UK aau 30 SNF SFCM eng sud aau a

我的表格如下:

SNF                 SFCM        POOL            QUOTA
a                   US          eng         11
a                   US          sud         20
b                   UK          aau         30
SNF      SFCM        eng       sud     aau
a        US          11        20         
b        UK                            30
SELECT SNF, SFCM, eng_quota, sud_quota, aau_quota FROM nc_so1
PIVOT
(
SUM(QUOTA) AS QUOTA
FOR pool
IN ('eng' as eng, 'sud' as sud, 'aau' as aau)
)
但希望其显示如下:

SNF                 SFCM        POOL            QUOTA
a                   US          eng         11
a                   US          sud         20
b                   UK          aau         30
SNF      SFCM        eng       sud     aau
a        US          11        20         
b        UK                            30
SELECT SNF, SFCM, eng_quota, sud_quota, aau_quota FROM nc_so1
PIVOT
(
SUM(QUOTA) AS QUOTA
FOR pool
IN ('eng' as eng, 'sud' as sud, 'aau' as aau)
)
我试着使用一个枢轴,如下所示

SELECT a.* FROM test
PIVOT
(
SUM(QUOTA) AS QUOTA
FOR pool
IN ('eng', 'sud', 'aau')
)
但似乎无法获得正确的输出

有人能给我提建议吗?另外,我想知道是否可以使用SQL语句代替“eng”、“sud”、“aau”。所以从测试中选择池


谢谢。

您的查询应如下所示:

SNF                 SFCM        POOL            QUOTA
a                   US          eng         11
a                   US          sud         20
b                   UK          aau         30
SNF      SFCM        eng       sud     aau
a        US          11        20         
b        UK                            30
SELECT SNF, SFCM, eng_quota, sud_quota, aau_quota FROM nc_so1
PIVOT
(
SUM(QUOTA) AS QUOTA
FOR pool
IN ('eng' as eng, 'sud' as sud, 'aau' as aau)
)

此外,使用SQL AFAIK生成动态列表也是不可能的。您的原始SQL只需稍作更改即可提供所需的结果:

SQL> with t (SNF, SFCM, POOL, QUOTA) as
  2  (
  3  select 'a','US','eng',11 from dual union all
  4  select 'a','US','sud',20 from dual union all
  5  select 'b','UK','aau',30 from dual
  6  )
  7  SELECT * FROM t
  8  PIVOT
  9  (
 10  SUM(QUOTA)
 11  FOR (pool)
 12  IN ('eng' "ENG", 'sud' "SUD", 'aau' "AAU")
 13  )
 14  /

SNF SFCM        ENG        SUD        AAU                                       
--- ---- ---------- ---------- ----------                                       
a   US           11         20                                                  
b   UK                                 30  
注意:从dynamic pivot开始-只有XML表单可用:

SQL> with t (SNF, SFCM, POOL, QUOTA) as
  2  (
  3  select 'a','US','eng',11 from dual union all
  4  select 'a','US','sud',20 from dual union all
  5  select 'b','UK','aau',30 from dual
  6  )
  7  SELECT * FROM t
  8  PIVOT XML
  9  (
 10  SUM(QUOTA)
 11  FOR (pool)
 12  IN (select pool from t)
 13  )
 14  /

SNF SFCM POOL_XML                                                               
--- ---- --------------------------------------------------                     
a   US   <PivotSet><item><column name = "POOL">aau</column>                     
         <column name = "SUM(QUOTA)"></column></item><item>                     
         <column name = "POOL">eng</column><column name = "                     
         SUM(QUOTA)">11</column></item><item><column name =                     
          "POOL">sud</column><column name = "SUM(QUOTA)">20                     
         </column></item></PivotSet>                                            

b   UK   <PivotSet><item><column name = "POOL">aau</column>                     
         <column name = "SUM(QUOTA)">30</column></item><ite                     
         m><column name = "POOL">eng</column><column name =                     
          "SUM(QUOTA)"></column></item><item><column name =                     
          "POOL">sud</column><column name = "SUM(QUOTA)"></                     
         column></item></PivotSet>

它是PL/SQL,但您可以对动态SQL使用EXEC IMMEDIATE。@RobertCo此答案中没有PL/SQL代码。你的观点是什么?