首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用动态列名的Oracle SQL转置

使用动态列名的Oracle SQL转置
EN

Stack Overflow用户
提问于 2012-06-06 19:53:58
回答 3查看 4.1K关注 0票数 2

我有一个简单的问题,我需要尽快解决。你能帮我一下吗?

问题是fOllows:我有两个表,一个定义表和一个历史表。

代码语言:javascript
复制
create table revenue history(operation_date date, revenue_id number, total_revenue number); 
create table revenue_definition(revenue_id number, revenue_name varchar2(100));

insert into revenue_definition values(1,'Car');
insert into revenue_definition values(2,'Minivan');
insert into revenue_definition values(3,'Bus');

insert into revenue history values(sysdate-2,1,100);
insert into revenue history values(sysdate-2,2,150);
insert into revenue history values(sysdate-2,3,100);

insert into revenue history values(sysdate-1,1,200);
insert into revenue history values(sysdate-1,2,150);
insert into revenue history values(sysdate-1,3,200);

insert into revenue history values(sysdate,1,100);
insert into revenue history values(sysdate,2,150);
insert into revenue history values(sysdate,3,100);

现在我要做的是展示这样一份报告;

operation_date小型客车

系统100 150 100

系统-1 200 150 200

sysdate-2 100 150 100

我知道,我可以通过使用解码或11g枢轴来实现这一点。但对于那些我需要知道的收入类型(汽车,小型货车等)预先和每次定义时,我需要更新我的代码。如果可能的话,我想避免这样做。

任何建议都欢迎,

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2012-06-06 20:21:54

听起来像是动态sql的候选。每次运行查询时,都需要将sql语句实际构建为字符串。您可以通过从definition表中选择、循环这些定义并将它们添加到sql语句中来构建列名字符串,然后:

代码语言:javascript
复制
execute immediate 'sql statement'

我知道没有其他方法可以动态更改查询运行时显示的列。

票数 2
EN

Stack Overflow用户

发布于 2012-10-16 15:19:07

此代码在Oracle 11g (11.2.0)数据库上的SQL*Plus中运行。

代码语言:javascript
复制
column dummy noprint
column "Header" format a14
column "Data"   format a40
SELECT 0 DUMMY
      ,'Operation Date' "Header"
      ,LISTAGG(lpad(' ', 9 - length(d.revenue_name) ,' ') || d.revenue_name ) WITHIN GROUP (ORDER BY d.revenue_id) "Data"
FROM  revenue_definition d
UNION
SELECT 1
      ,to_Char(h.operation_date,'DD-MON-YYYY')
      ,LISTAGG(lpad(' ',9 - length(h.total_revenue),' ') ||h.total_revenue) WITHIN GROUP (Order by d.revenue_id)
FROM revenue_definition d
    ,revenue_history    h
where h.revenue_id = d.revenue_id
group by h.operation_date
ORDER by 1, 2;

并产生这样的输出:

代码语言:javascript
复制
Header           Data
-------------- ----------------------------------------
Operation Date       Car  Minivan      Bus
15-OCT-2012          100      150      100
16-OCT-2012          200      150      200
17-OCT-2012          100      150      100
票数 2
EN

Stack Overflow用户

发布于 2012-06-06 20:49:20

您可以有一个函数将定义的内容作为一个单独的行-连接返回到定义和历史,应该返回您想要的,并根据定义中的数据更改进行调整。

一个例子:http://docs.oracle.com/cd/E18283_01/appdev.112/e17126/tuning.htm#BABIEICA

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10921212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档