2016-08-03 18 views
0

カウントピボットクエリの合計を計算しようとしています。ピボット総数 - オラクル

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

、ありがとうございました。

SETUP:

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 –