Можно ли вычислить относительное соотношение одним запросом?
skelet
Дата: 24.11.2009 14:47:36
т.е. есть некая
create table T (a id primary key, b number(10));
надо выбрать
select count(*) from T
where b = 1;
и ещё относительную величину, кол-во записей с критерием, на общее кол-во записей в таблице T.
это реально сделать одним запросом?
AlexFF__|
Дата: 24.11.2009 14:58:05
а в чем прикол?
select count(*) over(), sum( decode(b, 1, 1, 0) ) over() / count(*) over()
from Т
4ton
Дата: 24.11.2009 15:06:27
так будет много строчек. Нужна, видимо одна. Еще из этого надо выбрать одну строку.
Тогда можно проще, даже без аналитики:
select count(decode(b,1,1)),count(decode(b,1,1))/count(1)
skelet
Дата: 24.11.2009 15:35:59
4ton,
не не не, decode нельзя, условие в where может быть не столь простым, т.е. =1 это я просто для примера привёл...
Elic
Дата: 24.11.2009 15:39:06
select count(*), count(*) / (select count(*) from T) from T where ...;
А case - можно.
serg_psv
Дата: 24.11.2009 16:00:57
Select
count(1) all_count,
sum(case when сложное_условие then 1 else null end) condition_count
from
T
4ton
Дата: 24.11.2009 16:06:42
Elic,
Так, загрузился. Почему
SQL> select (select count(1) from dual) from dual
2 /
(SELECTCOUNT(1)FROMDUAL)
------------------------
1
но
SQL> select count(1)/(select count(1) from dual) from dual
2 /
select count(1)/(select count(1) from dual) from dual
ORA-00937: not a single-group group function
Почему верхний запрос проходит, а нижний нет?
skelet
Дата: 24.11.2009 16:29:47
Elic |
select count(*), count(*) / (select count(*) from T) from T where ...; А case - можно. |
если бы такое работало
suPPLer
Дата: 24.11.2009 16:31:31
skelet,
во from передвиньте подзапрос, проблем-то... И заверните поле с count() из этого подзапроса в max() или добавьте его в group by.
AlexFF__|
Дата: 24.11.2009 16:34:44
skelet |
Elic | select count(*), count(*) / (select count(*) from T) from T where ...; А case - можно. |
если бы такое работало  |
select count(*) over(), count(*) over() / (select count(*) from Т) from from T where ...;