Plsql 不带聚合的oracle 11g pl/sql数据透视表

Plsql 不带聚合的oracle 11g pl/sql数据透视表,plsql,oracle11g,pivot,Plsql,Oracle11g,Pivot,正在尝试了解如何编写动态pivot pl/sql语句。 我看到的大多数例子都包含了一些来自聚合的例子。 我正在寻找一个直接的价值轴心 源表: 期望输出: 请帮忙 实际上,您必须使用聚合函数,但如果特定条件只有一个值,则可以使用一个不起任何作用的值,如MAX 周一的代码示例(您可以轻松地在其他日期采用它): 带有w_start_time的部分仅用于将所有开始时间保留在输出中。如果输出中不需要所有区域都为空的记录,则可以将其删除。谢谢,但这并不能解决我的问题,因为我有数百个id\u区域。我希望编译器

正在尝试了解如何编写动态pivot pl/sql语句。 我看到的大多数例子都包含了一些来自聚合的例子。 我正在寻找一个直接的价值轴心

源表: 期望输出:
请帮忙 实际上,您必须使用聚合函数,但如果特定条件只有一个值,则可以使用一个不起任何作用的值,如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);