将行值显示为列标题

QKW*_*KWS 9 sql oracle plsql oracle10g

我有一个select声明

SELECT * 
  FROM TABLENAME 
 WHERE WORKERNAME = 'A'
   AND DATE = '12/17/2014'
Run Code Online (Sandbox Code Playgroud)

输出将是:

FREE | USED | DATE      | WORKERNAME
------------------------------------
  1  |  0   |12/17/2014 | A
  1  |  0   |12/17/2014 | A      
  1  |  0   |12/17/2014 | A     
Run Code Online (Sandbox Code Playgroud)

我需要有一个输出,其中输出DATEWORKERNAME将是列标题,如下所示:

    A
----------
12/17/2014
----------
FREE | USED
----------
1    | 0
1    | 0
1    | 0
Run Code Online (Sandbox Code Playgroud)

有人可以建议如何使用oracle SQL或PL/SQL实现这一目标吗?

Nic*_*nov 3

使用纯 SQL 甚至 PL/SQL 生成输出并不是那么优雅。如果让客户来做这项工作会更好。根据您希望如何向最终用户呈现最终输出,您的选择范围从简单的 SQL*PLUS 到更复杂的报告工具。以下是如何使用 SQL*PLUS 生成该输出的简单示例:

clear screen;

column workername new_value worker_name;
column date1 new_value d1;
column workername noprint;
column date1 noprint;
set linesize 15;
column free format a7;
column used format a7;
ttitle center worker_name skip 1 -
center '------------' skip 1 -
center d1 skip 1 -
center '------------' skip 1;
set colsep '|'

/* sample of data from your question */
with t1(free, used, date1, workername) as(
   select 1, 0, date '2014-12-17', 'A' from dual union all
   select 1, 0, date '2014-12-17', 'A' from dual union all
   select 1, 0, date '2014-12-17', 'A' from dual
)
select to_char(free) as free
     , to_char(used) as used
     , to_char(date1, 'mm/dd/yyyy') as date1
     , workername
  from t1
 where workername = 'A'
   and date1 = date '2014-12-17';
Run Code Online (Sandbox Code Playgroud)

结果:

       A       
  ------------ 
   12/17/2014   
  ------------ 
 FREE   |USED   
 -------|-------
 1      |0      
 1      |0      
 1      |0  
Run Code Online (Sandbox Code Playgroud)

如果需要生成包含不同workernames或/和不同的报告datebreak on则可以使用 SQL*PLUS 命令来分解特定列或列组合的报告。例如:

column workername new_value worker_name;
column date1 new_value d1;
column workername noprint;
column date1 noprint;
set linesize 15;
column free format a7;
column used format a7;
ttitle center worker_name skip 1 -
center '------------' skip 1 -
center d1 skip 1 -
center '------------' skip 1;
set colsep '|'
break on worker_name skip page on date1 skip page;

/* sample of data  */
with t1(free, used, date1, workername) as(
   select 1, 0, date '2014-12-17', 'A' from dual union all
   select 1, 0, date '2014-11-17', 'A' from dual union all
   select 1, 0, date '2014-12-17', 'A' from dual union all
   select 1, 0, date '2014-11-17', 'B' from dual
)
select to_char(free) as free
     , to_char(used) as used
     , to_char(date1, 'mm/dd/yyyy') as date1
     , workername
  from t1
 order by workername, date1;
Run Code Online (Sandbox Code Playgroud)

结果:

       A       
  ------------ 
   11/17/2014  
  ------------ 
FREE   |USED   
-------|-------
1      |0      

       A       
  ------------ 
   12/17/2014  
  ------------ 
FREE   |USED   
-------|-------
1      |0      
1      |0      

       B       
  ------------ 
   11/17/2014  
  ------------ 
FREE   |USED   
-------|-------
1      |0      
Run Code Online (Sandbox Code Playgroud)

这是SQL*PLUS 用户指南,您可以在其中找到有关上述示例中使用的任何命令的详细信息。