oraclesql中的PIVOT表

oraclesql中的PIVOT表,sql,oracle,pivot,Sql,Oracle,Pivot,我有这样的数据: end date billing 30-NOV-16 0 31-DEC-16 0 31-JAN-17 0 28-FEB-17 208200 31-MAR-17 362950 31-OCT-16 30-NOV-16 31-DEC-16 31-JAN-17 28-FEB-17 31-MAR-17 billing 0 0 0 0 20820

我有这样的数据:

end date    billing
30-NOV-16   0
31-DEC-16   0
31-JAN-17   0
28-FEB-17   208200
31-MAR-17   362950
           31-OCT-16  30-NOV-16 31-DEC-16  31-JAN-17    28-FEB-17   31-MAR-17
billing     0          0          0          0           208200     362950
pd_data     10        100        200         90          30          50
mn_data      1         2          3           4           5           6
当我运行此查询时:

 SELECT *
   FROM
     (SELECT  


        ps.end_date end_date

     ,  ps.itd_gross_billing  billing 

FROM  project_summary_v  ps 
JOIN  projects_dtl  pd ON ps.project_id=pd.project_id 
JOIN  periods_dim xpd ON ps.end_date=xpd.end_date 
WHERE  pd.project_number=100 

FETCH FIRST 6 rows only
      )
   PIVOT
     (
             max(billing)                
             FOR end_date in ( '31-OCT-16' 
,'30-NOV-16'
,'31-DEC-16'
,'31-JAN-17'
,'28-FEB-17'
,'31-MAR-17' )
      );
我得到以下输出

   31-OCT-16  30-NOV-16 31-DEC-16  31-JAN-17    28-FEB-17   31-MAR-17
     0         0          0          0           208200     362950
到目前为止一切都很好。但是当我有更多的数据列时

   end date    billing   pd_data  mn_data
    31-OCT-16   0           10      1
    30-NOV-16   0          100      2
    31-DEC-16   0          200      3
    31-JAN-17   0          90       4
    28-FEB-17   208200     30       5
    31-MAR-17   362950     50       6
这张桌子怎么转位?另外,如果结束日期是动态的(现在我已经硬编码了),那么in()中的查询应该是什么

输出应该如下所示:

end date    billing
30-NOV-16   0
31-DEC-16   0
31-JAN-17   0
28-FEB-17   208200
31-MAR-17   362950
           31-OCT-16  30-NOV-16 31-DEC-16  31-JAN-17    28-FEB-17   31-MAR-17
billing     0          0          0          0           208200     362950
pd_data     10        100        200         90          30          50
mn_data      1         2          3           4           5           6

我认为下面的查询会起作用。我已将查询分离到pivot。希望这有帮助

SELECT   *
  FROM
    (SELECT   ps.end_date end_date ,
        ps.itd_gross_billing billing
      FROM project_summary_v ps
      JOIN projects_dtl pd
      ON ps.project_id=pd.project_id
      JOIN periods_dim xpd
      ON ps.end_date         =xpd.end_date
      WHERE pd.project_number=100
    FETCH FIRST 6 rows only
    ) pivot( MAX(billing) FOR end_date IN ( '31-OCT-16' ,'30-NOV-16' ,'31-DEC-16' ,'31-JAN-17' ,'28-FEB-17' ,'31-MAR-17' ) )
UNION ALL
SELECT   *
  FROM
    (SELECT   ps.end_date end_date ,
        ps.pd_data pd_data
      FROM project_summary_v ps
      JOIN projects_dtl pd
      ON ps.project_id=pd.project_id
      JOIN periods_dim xpd
      ON ps.end_date         =xpd.end_date
      WHERE pd.project_number=100
    FETCH FIRST 6 rows only
    ) pivot( MAX(pd_data) FOR end_date IN ( '31-OCT-16' ,'30-NOV-16' ,'31-DEC-16' ,'31-JAN-17' ,'28-FEB-17' ,'31-MAR-17' ) )
UNION ALL
SELECT   *
  FROM
    (SELECT   ps.end_date end_date ,
        ps.mn_data mn_data
      FROM project_summary_v ps
      JOIN projects_dtl pd
      ON ps.project_id=pd.project_id
      JOIN periods_dim xpd
      ON ps.end_date         =xpd.end_date
      WHERE pd.project_number=100
    FETCH FIRST 6 rows only
    ) pivot( MAX(mn_data) FOR end_date IN ( '31-OCT-16' ,'30-NOV-16' ,'31-DEC-16' ,'31-JAN-17' ,'28-FEB-17' ,'31-MAR-17' ) )

“如何转换这个表”-你必须说出你想要的结果。至于第二部分,您不能将其完全动态化,也不能在
in()
部分中使用查询,您必须使用PL/SQL和动态SQL或XML pivot。您可能会将n个最新值显示为列,但标题会成为一个问题。同样,在某种程度上,这取决于你想要它是什么样子。(另外,您的列实际上是日期还是字符串?您使用了错误的数据类型,或者依赖NLS设置进行隐式转换…)编辑了my post@Alex这里的重点是什么?如果这是一个报表,并且您使用了一些报表应用程序,那么报表应用程序可能有更好的工具来进行这种数据透视,而不是手动使用SQL(或使用PL/SQL),特别是如果您不是高级PL/SQL或XML程序员的话。