2010-10-04 4 views

ответ

4

Эта таблица моделирует ситуацию:

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. 

Ваш результат только три строки пропускает итога, так что это немного неточно: Накопительный (а, б) результаты в 3 наборах групп с 4 строками.

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. 

С регулярной группы по и аналитической функции на вершине, вы можете достичь желаемого результата: набор

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. 

С уважением, Роб.

+0

отлично! Спасибо! – mitsky

1

Использование:

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

Это дважды вызывает YOUR_TABLE, что необязательно. –

+0

@Rob van Wijk: Я согласен, что он дважды обращается к таблице, но нет никакой альтернативы, если аналитика не поддерживается (pre 8i) –

Смежные вопросы