2016-08-03 9 views
0

Ich versuche, die Summe einer Anzahl Pivot-Abfrage zu berechnen.Pivot Gesamtanzahl - Oracle

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

Oben ist die Visualisierung der Daten in der Tabelle.

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; 

Dies ist der Code, den ich verwende, um meine Tabelle zu schwenken. Es gibt mir dieses Ergebnis:

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

So ist der Zweck dieser Abfrage ist, dass der Benutzer eine visuaulization bekommt, wie viele männliche/weibliche Sprache sprechen.

Ich versuche, eine Summe für jede Spalte und eine Summe für jede Zeile zu erhalten.

sollte das Ergebnis so aussehen:

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

mir jemand helfen könnte heraus, wie das erreichen?

Vielen Dank im Voraus, Brent

+0

Bitte Daten als formatierten Text, nicht Bilder; hier findest du etwas über das Bauen eines [mcve] – Aleksej

+0

@Aleksej Changed es. Danke –

Antwort

1

Ich habe versucht, den Code zu ändern, um Ihren Bedarf zu passen.

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 
) 

Die Funktion:

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; 

Dieser Aufruf pivot_func(1) Diese Abfrage ergibt:

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, ()) 

Dies ist das Ergebnis der Abfrage:

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

Grundsätzlich fügte ich einige Klar dynamische SQL die Summe der auf jeder Zeile zu berechnen, und verwendet dann eine externe Abfrage zu gruppieren und die Gesamtsumme zu berechnen; Credits für die Verwendung von GROUPING SETS gehen Sie zu this.

+0

Das hat wie ein Zauber funktioniert. Ich danke dir sehr! @Aleksej –