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程序员的话。