Plsql 不带聚合的oracle 11g pl/sql数据透视表
正在尝试了解如何编写动态pivot pl/sql语句。 我看到的大多数例子都包含了一些来自聚合的例子。 我正在寻找一个直接的价值轴心 源表: 期望输出:Plsql 不带聚合的oracle 11g pl/sql数据透视表,plsql,oracle11g,pivot,Plsql,Oracle11g,Pivot,正在尝试了解如何编写动态pivot pl/sql语句。 我看到的大多数例子都包含了一些来自聚合的例子。 我正在寻找一个直接的价值轴心 源表: 期望输出: 请帮忙 实际上,您必须使用聚合函数,但如果特定条件只有一个值,则可以使用一个不起任何作用的值,如MAX 周一的代码示例(您可以轻松地在其他日期采用它): 带有w_start_time的部分仅用于将所有开始时间保留在输出中。如果输出中不需要所有区域都为空的记录,则可以将其删除。谢谢,但这并不能解决我的问题,因为我有数百个id\u区域。我希望编译器
请帮忙 实际上,您必须使用聚合函数,但如果特定条件只有一个值,则可以使用一个不起任何作用的值,如MAX 周一的代码示例(您可以轻松地在其他日期采用它):
带有w_start_time的部分仅用于将所有开始时间保留在输出中。如果输出中不需要所有区域都为空的记录,则可以将其删除。谢谢,但这并不能解决我的问题,因为我有数百个id\u区域。我希望编译器迭代所有数据,而无需指定任何内容。无论如何,谢谢你。我担心如果不把所有的区域直接放在查询中,这是不可能的。我过去所做的是正确选择excel格式的所有值,并将粘贴复制到查询中。请同时检查以下参考:。XML数据透视有一个技巧,但只有知道不同区域的数量,它才能起作用。
id_employed id_zone id_area day StartTime
----------------------------------------------------------------
s01 Zone001 area1 monday 9AM
s01 Zone001 area1 monday 11AM
s02 Zone001 area1 tuesday 10AM
s03 Zone002 area3 tuesday 10AM
s03 Zone001 area3 friday 10AM
s04 Zone002 area1 friday 9AM
s05 Zone001 area3 friday 9AM
s06 Zone001 area2 friday 3PM
s07 Zone001 area1 friday 1PM
s08 Zone002 area1 friday 7PM
Zone001
monday
area1 area2 area3
------------------------------------------------------
9AM s01
10AM
11AM s01
1PM
3PM
7PM
tuesday
area1 area2 area3
------------------------------------------------------
9AM
10AM s02
11AM
1PM
3PM
7PM
friday
area1 area2 area3
------------------------------------------------------
9AM s05
10AM s03
11AM
1PM s07
3PM s06
7PM
Zone002
monday
area1 area2 area3
------------------------------------------------------
9AM
10AM
11AM
1PM
3PM
7PM
tuesday
area1 area2 area3
------------------------------------------------------
9AM
10AM s03
11AM
1PM
3PM
7PM
friday
area1 area2 area3
------------------------------------------------------
9AM s04
10AM
11AM
1PM
3PM
7PM s08
drop table my_test;
/
create table my_test(
id_employed VARCHAR2(200),
id_znoe VARCHAR2(200),
id_area VARCHAR2(200),
day VARCHAR2(200),
start_time VARCHaR2(200)
);
/
insert into my_test values('s01', 'Zone001', 'area1', 'monday', '9AM');
insert into my_test values('s01', 'Zone001', 'area1', 'monday', '11AM');
insert into my_test values('s02', 'Zone001', 'area1', 'tuesday', '10AM');
insert into my_test values('s03', 'Zone002', 'area3', 'tuesday', '10AM');
insert into my_test values('s03', 'Zone001', 'area3', 'friday', '10AM');
insert into my_test values('s04', 'Zone002', 'area1', 'friday', '9AM');
insert into my_test values('s05', 'Zone001', 'area3', 'friday', '9AM');
insert into my_test values('s06', 'Zone001', 'area2', 'friday', '3PM');
insert into my_test values('s07', 'Zone001', 'area1', 'friday', '1PM');
insert into my_test values('s08', 'Zone002', 'area1', 'friday', '7PM');
/
WITH w_start_time AS (
SELECT DISTINCT start_time
FROM my_test
)
, w_monday AS (
SELECT start_time
,id_employed
,id_area
FROM my_test
WHERE day = 'monday'
)
, w_pivot AS (
select *
from w_monday
PIVOT (
MAX(id_employed)
FOR id_area
IN ( 'area1' AS area1
,'area2' AS area2
,'area3' AS area3
)
)
)
SELECT *
FROM w_start_time
LEFT JOIN w_pivot
USING(start_time);