2010-10-04 8 views
1
résultat
SELECT a,b,count(*) 
FROM t 
GROUP BY rollup(a,b) 

:oracle groupe sql compte

a1, b1, 10 
a1, b2, 90 
a1, , 100 

i besoin:

a1, b1, 10, 100 
a1, b2, 90, 100 

comment?

Répondre

4

Ce tableau simule votre situation:

SQL> create table t (a,b) 
    2 as 
    3 select 'a1', 'b1' 
    4  from dual 
    5 connect by level <= 10 
    6 union all 
    7 select 'a1', 'b2' 
    8  from dual 
    9 connect by level <= 90 
10/

Table created. 

Votre résultat avec seulement trois lignes manque le grand total, donc c'est un peu inexact: Rollup (a, b) les résultats en 3 groupes avec 4 lignes.

SQL> select a 
    2  , b 
    3  , count(*) 
    4 from t 
    5 group by rollup(a,b) 
    6/

A B COUNT(*) 
-- -- ---------- 
a1 b1   10 
a1 b2   90 
a1   100 
      100 

4 rows selected. 

Avec un groupe régulier par une fonction analytique et sur le dessus, vous pouvez obtenir votre jeu de résultat souhaité:

SQL> select a 
    2  , b 
    3  , count(*) 
    4  , sum(count(*)) over (partition by a) 
    5 from t 
    6 group by a 
    7  , b 
    8/

A B COUNT(*) SUM(COUNT(*))OVER(PARTITIONBYA) 
-- -- ---------- ------------------------------- 
a1 b2   90        100 
a1 b1   10        100 

2 rows selected. 

Cordialement, Rob .

+0

génial! Je vous remercie! – mitsky

1

Utilisation:

SELECT t.a, 
     t.b, 
     COUNT(*), 
     (SELECT COUNT(*) 
      FROM YOUR_TABLE 
     GROUP BY t.a) 
    FROM YOUR_TABLE t 
GROUP BY t.a, t.b 
+0

Ceci accède deux fois à YOUR_TABLE, ce qui n'est pas nécessaire. –

+0

@Rob van Wijk: Je suis d'accord qu'il accède à la table deux fois, mais il n'y a pas d'alternative si les analyses ne sont pas supportées (pré 8i) –