您需要一個具有動態列定義的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