2016-08-03 156 views
0

我想計算一個計數數據透視查詢的總數。樞軸總數 - oracle

id | kolomtellingwaarde | regeltellingwaarde | 
-------------------------------------------------| 
1 |   Dutch  |   M   | 
2 |   Dutch  |   M   | 
3 |   English  |   F   | 
4 |   French  |   F   | 
5 |   French  |   M   | 

以上是表中數據的可視化。

FUNCTION pivot_func(p_seqanalytics IN NUMBER) 
    RETURN sys_refcursor 
AS 
    v_sql  varchar2 (32767); 
    v_refcur sys_refcursor; 
BEGIN 
    v_sql := 
    'SELECT * 
    FROM (SELECT kolomtellingwaarde, 
        regeltellingwaarde 
     FROM analytics_bindingresults 
     WHERE seqanalytics = ' || p_seqanalytics || ') 
    PIVOT (COUNT (*) 
     FOR kolomtellingwaarde IN ('; 
FOR r IN 
    (SELECT DISTINCT kolomtellingwaarde 
    FROM analytics_bindingresults 
    WHERE seqanalytics = p_seqanalytics) 
LOOP 
    v_sql := v_sql || '''' || r.kolomtellingwaarde || ''','; 
END LOOP; 
v_sql := rtrim (v_sql, ',') || ')) order by 1'; 
OPEN v_refcur FOR v_sql; 
RETURN v_refcur; 
END pivot_func; 

這是我用來旋轉我的表的代碼。它會給我這樣的結果:

Regeltellingwaarde | French | Dutch | English | 
------------------------------------------------------| 
     M   | 1  |  2 |  0 | 
     F   | 1  |  0 |  1 | 

所以這個查詢的目的是使用戶得到一個visuaulization不少男/女是如何講的語言。

我試圖讓每列的總數和每行的總數。

結果應該是這樣的:

 Dutch English French Total 
M  2  0  1  3 
F  0  1  1  2 
Total 2  1  2  5 

有人能幫助我就如何實現這一目標?

謝謝你在前進, 布倫特

+0

請將數據作爲格式文本發佈,而不是圖片;在這裏你找到了關於建立一個[mcve] – Aleksej

+0

@Aleksej改變了它。謝謝 –

回答

1

我試圖修改代碼以滿足您的需求。

設置:

create table analytics_bindingresults(id, kolomtellingwaarde, regeltellingwaarde, seqanalytics) as ( 
select 1, 'Dutch' ,'M', 1 from dual union all 
select 2, 'Dutch' ,'M', 1 from dual union all 
select 3, 'English' ,'F', 1 from dual union all 
select 4, 'French' ,'F', 1 from dual union all 
select 5, 'French' ,'M', 1 from dual 
) 

功能:

FUNCTION pivot_func(p_seqanalytics IN NUMBER) 
    RETURN sys_refcursor 
AS 
    v_sql  varchar2 (32767); 
    vGroupSql varchar2 (32767); 
    vSumSql varchar2 (32767); 
    v_refcur sys_refcursor; 
BEGIN 
    v_sql := 
    'SELECT * 
    FROM (SELECT kolomtellingwaarde, 
        regeltellingwaarde 
     FROM analytics_bindingresults 
     WHERE seqanalytics = ' || p_seqanalytics || ') 
    PIVOT (COUNT (*) 
     FOR kolomtellingwaarde IN ('; 
FOR r IN 
    (SELECT DISTINCT kolomtellingwaarde 
    FROM analytics_bindingresults 
    WHERE seqanalytics = p_seqanalytics) 
LOOP 
    v_sql := v_sql || '''' || r.kolomtellingwaarde || ''','; 
    vGroupSql := vGroupSql || 'sum("''' || r.kolomtellingwaarde || '''"),'; 
    vSumSql := vSumSql || '"''' || r.kolomtellingwaarde || '''"+'; 
END LOOP; 
vGroupSql := 'regeltellingwaarde, ' || rtrim(vGroupSql, ','); 
vSumSql := 'sum(' || rtrim(vSumSql, '+') || ')'; 
v_sql := rtrim (v_sql, ',') || ')) order by 1'; 
v_sql := 'select ' || vGroupSql || ', ' || vSumSql || ' as total from (' || v_sql || ') group by grouping sets (regeltellingwaarde,())'; 
dbms_output.put_line(v_sql); 
OPEN v_refcur FOR v_sql; 
RETURN v_refcur; 
END pivot_func; 

此調用pivot_func(1)給出了這樣的查詢:

SELECT regeltellingwaarde, 
     SUM("'Dutch'"), 
     SUM("'French'"), 
     SUM("'English'"), 
     SUM("'Dutch'" + "'French'" + "'English'") AS total 
    FROM ( SELECT * 
       FROM (SELECT kolomtellingwaarde, regeltellingwaarde 
         FROM analytics_bindingresults 
        WHERE seqanalytics = 1) PIVOT (COUNT(*) FOR kolomtellingwaarde IN ('Dutch', 'French', 'English')) 
      ORDER BY 1) 
GROUP BY GROUPING SETS(regeltellingwaarde, ()) 

這是查詢的結果是:

R SUM("'DUTCH'") SUM("'FRENCH'") SUM("'ENGLISH'")  TOTAL 
- -------------- --------------- ---------------- ---------- 
F    0    1    1   2 
M    2    1    0   3 
       2    2    1   5 

基本上,我增加了一些簡單的動態SQL來計算每行的總,然後使用外部查詢分組和計算總計; GROUPING SETS用法的積分爲this

+0

這工作就像一個魅力。非常感謝! @Aleksej –