SELECT a,b,count(*)
FROM t
GROUP BY rollup(a,b)
результат:Oracle SQL группа подсчитывать
a1, b1, 10
a1, b2, 90
a1, , 100
мне нужно:
a1, b1, 10, 100
a1, b2, 90, 100
как?
SELECT a,b,count(*)
FROM t
GROUP BY rollup(a,b)
результат:Oracle SQL группа подсчитывать
a1, b1, 10
a1, b2, 90
a1, , 100
мне нужно:
a1, b1, 10, 100
a1, b2, 90, 100
как?
Эта таблица моделирует ситуацию:
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.
С уважением, Роб.
Использование:
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
Это дважды вызывает YOUR_TABLE, что необязательно. –
@Rob van Wijk: Я согласен, что он дважды обращается к таблице, но нет никакой альтернативы, если аналитика не поддерживается (pre 8i) –
отлично! Спасибо! – mitsky