Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как сделать это красиво  [new]
T800
Member

Откуда: A
Сообщений: 237
День добрый.
Как заставить запрос вернуть общее количество записей и количество уникальных записей в таблице.
Пример:
With mytable as  (select 1 as nr from dual 
                  union all 
                  select 1 as nr from dual 
                  union all  
                  select 2 as nr from dual 
                  union all  
                  select 2 as nr from dual 
                  union all 
                  select 3 as nr from dual)
Получить в одном селекте оба значения:
select count (nr) from mytable;
select count (nr) from (select distinct nr as nr from mytable);

Вариант, который приходит в голову - через join. Но это некрасиво.
Можете подсказать более грамотный вариант?
Спасибо.
6 мар 07, 09:33    [3867429]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
SQL> With mytable as  (select 1 as nr from dual 
  2                    union all 
  3                    select 1 as nr from dual 
  4                    union all  
  5                    select 2 as nr from dual 
  6                    union all  
  7                    select 2 as nr from dual 
  8                    union all 
  9                    select 3 as nr from dual)
 10   select count(*), count(distinct nr)
 11    from mytable;

  COUNT(*) COUNT(DISTINCTNR)
---------- -----------------
         5                 3
6 мар 07, 09:38    [3867455]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
Elic
Member

Откуда:
Сообщений: 29976
select count(nr), count(distinct nr) from mytable;
6 мар 07, 09:38    [3867456]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
select case 
         when v2.rn = 1 then total_cnt 
         when v2.rn = 2 then distinct_cnt 
       end as cnt
  from (
         select count(1) total_cnt, count(distinct nr) distinct_cnt
           from mytable 
       ) v1, 
       (
         select 1 as rn from dual union all select 2 from dual
       ) v2
6 мар 07, 09:41    [3867473]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
T800
Member

Откуда: A
Сообщений: 237
Данке шён
6 мар 07, 09:46    [3867505]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
T800
Member

Откуда: A
Сообщений: 237
Но сразу же вопрос другой: что делать, если уникальность определяется не одним полем:
With mytable as  (select 1 as nr , 2 as nt from dual 
                  union all 
                  select 1 as nr , 2 as nt from dual 
                  union all  
                  select 2 as nr , 2 as nt from dual 
                  union all  
                  select 2 as nr , 2 as nt from dual 
                  union all 
                  select 3 as nr , 2 as nt from dual
                  union all
                  select 3 as nr , 1 as nt from dual)
А получить следует:
select count (1) from (select distinct nr, nt from mytable);
select count (1) from mytable;

Спасибо.
6 мар 07, 09:59    [3867603]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
SQL> With mytable as  (select 1 as nr , 2 as nt from dual 
  2                    union all 
  3                    select 1 as nr , 2 as nt from dual 
  4                    union all  
  5                    select 2 as nr , 2 as nt from dual 
  6                    union all  
  7                    select 2 as nr , 2 as nt from dual 
  8                    union all 
  9                    select 3 as nr , 2 as nt from dual
 10                    union all
 11                    select 3 as nr , 1 as nt from dual)
 12  select sum(cnt) cnt, max(rownum) distinct_cnt
 13   from (select count(*) cnt from mytable group by nr, nt);

       CNT DISTINCT_CNT
---------- ------------
         6            4
6 мар 07, 10:06    [3867657]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
skropotov
Member

Откуда:
Сообщений: 186
With mytable as  (select 1 as nr , 2 as nt from dual 
                  union all 
                  select 1 as nr , 2 as nt from dual 
                  union all  
                  select 2 as nr , 2 as nt from dual 
                  union all  
                  select 2 as nr , 2 as nt from dual 
                  union all 
                  select 3 as nr , 2 as nt from dual
                  union all
                  select 3 as nr , 1 as nt from dual)
select count(nr), count(distinct to_char(nr,'99')||'_'||to_char(nt, '99')) from mytable   
6 мар 07, 10:08    [3867676]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
T800
Member

Откуда: A
Сообщений: 237
Спасибо еще раз.
6 мар 07, 10:13    [3867724]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
T800
Member

Откуда: A
Сообщений: 237
Самого после всего хватило только на такое:
With mytable as  (select 1 as nr , 2 as nt from dual 
                  union all 
                  select 1 as nr , 2 as nt from dual 
                  union all  
                  select 2 as nr , 2 as nt from dual 
                  union all  
                  select 2 as nr , 2 as nt from dual 
                  union all 
                  select 3 as nr , 2 as nt from dual
                  union all
                  select 3 as nr , 1 as nt from dual)
select cnt, dcnt from (select count(1) as cnt from mytable), (select count (1) as dcnt from (select distinct nr, nt from mytable));
6 мар 07, 10:38    [3867913]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
T800
Самого после всего хватило только на такое:
..

With mytable as  (..)
select count(1) cnt, count(distinct nr||chr(0)||nt) dcnt from mytable;
6 мар 07, 12:36    [3869032]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
T800
Member

Откуда: A
Сообщений: 237
Сенкс, резонэбл
6 мар 07, 16:52    [3871138]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать это красиво  [new]
AlexOI
Member

Откуда: Санкт-Петербург
Сообщений: 161
Такого варианта вроде не было

With mytable as (select 1 as nr from dual
union all
select 1 as nr from dual
union all
select 2 as nr from dual
union all
select 2 as nr from dual
union all
select 3 as nr from dual)
select sum(count(*)) c, count(count(*)) d
from mytable group by nr;
6 мар 07, 17:52    [3871540]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить