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)
我需要有一个输出,其中输出DATE和WORKERNAME将是列标题,如下所示:
A
----------
12/17/2014
----------
FREE | USED
----------
1 | 0
1 | 0
1 | 0
Run Code Online (Sandbox Code Playgroud)
有人可以建议如何使用oracle SQL或PL/SQL实现这一目标吗?
使用纯 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或/和不同的报告date,break 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 用户指南,您可以在其中找到有关上述示例中使用的任何命令的详细信息。
| 归档时间: |
|
| 查看次数: |
2750 次 |
| 最近记录: |