您需要一个具有动态列定义的PIVOT函数。最简单的方法是支点的xml:
create table tst_data (id int primary key, source varchar2(255));
insert into tst_data values (1, 'INTERNET');
insert into tst_data values (2, 'DEMO');
insert into tst_data values (3, 'INTERNET');
insert into tst_data values (4, 'SALES');
insert into tst_data values (5, 'INTERNET');
insert into tst_data values (6, 'DEMO');
insert into tst_data values (7, 'INTERNET');
insert into tst_data values (8, 'COM');
commit;
select * from (
select source from tst_data
)
pivot xml
(
count(1)
for source in (select distinct t.source from tst_data t)
)
后,您需要处理XML数据:
<PivotSet>
<item>
<column name = "SOURCE">COM</column>
<column name = "COUNT(1)">1</column>
</item>
<item>
<column name = "SOURCE">DEMO</column>
<column name = "COUNT(1)">2</column>
</item>
<item>
<column name = "SOURCE">INTERNET</column>
<column name = "COUNT(1)">4</column>
</item>
<item>
<column name = "SOURCE">SALES</column>
<column name = "COUNT(1)">1</column>
</item>
</PivotSet>
PIVOT XML
支持动态栏定义(for source in (select distinct t.source from tst_data t)
),但是它返回的XML数据。 Extractvalue
和xmltable
函数允许从服务器端的XML中查询特定的列,但是您必须提前指定字段名称。所以我假设在客户端解析它。
如果你想在数据库层上做所有事情,还有另一种方法。 PIVOT
(不是XML)需要列名称for source in ('INTERNET', 'DEMO', 'COM', ...)
。这有可能产生这样的查询并返回一个光标到客户端:
CREATE OR REPLACE FUNCTION FUNCTION1 RETURN SYS_REFCURSOR AS
cur sys_refcursor;
BEGIN
open cur for 'select * from dual'; // generate PIVOT query here
RETURN cur;
END FUNCTION1;
我不知道有什么方法来创建光标一个简单的无类型查询(服务器端),所以如果你的愿望使用普通SQL查询分两步执行:
- 在PL/SQL函数中生成具有命名列的PIVOT查询;
- 从客户端运行查询。
您如何知道在'total'中包含哪些值?或者你是否包括了一切 - 如果这样的话有点意思。 –
是的,你可以使这个查询动态。我会动态地使用您正在使用的代码语言,c#,php等动态构建查询。如果您不能这样做,可以在oracle中使用while循环或游标。让我们更多地了解您的需求,以及您如何确定您的病例陈述中的价值。 – Vulcronos
也许你在问一个PIVOT? – Randy