Можно ли вычислить относительное соотношение одним запросом?

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 ...;
skelet
decode нельзя
А 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 ...;
skelet
decode нельзя
А 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 ...;
skelet
decode нельзя
А case - можно.

если бы такое работало


select count(*) over(), count(*) over() / (select count(*) from Т) from from T where ...;