Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хитрый запрос с группировкой / 14 сообщений из 14, страница 1 из 1
20.05.2003, 11:09:20
    #32163740
Andrej
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
Есть некая таблица

Код: plaintext
1.
2.
Create table ttt (
name varchar2( 100 ),
vvod date );


Группировку по годам сделать просто:

Код: plaintext
Select count(*), year(vvod) from ttt group by vvod; 


А можно ли сделать группировку по интервалам значений year(vvod):
1990-1994 ... 2000-2004

Или обычными средствами SQL это не делается
и надо писать процедурку?
...
Рейтинг: 0 / 0
20.05.2003, 11:27:23
    #32163771
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select bottom||' - '||top interval
     , count(*)
from (select to_char(vvod, 'yyyy') - mod(to_char(vvod, 'yyyy'),  5 ) bottom
           , to_char(vvod, 'yyyy') +  4  - mod(to_char(vvod, 'yyyy'),  5 ) top
      from ttt
      )
group by bottom||' - '||top
/
...
Рейтинг: 0 / 0
20.05.2003, 11:59:41
    #32163819
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
Наверняка есть какие-то аналитические функции для этого.

А если тупо можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
select
  inter, count(*)
 from
 (select d.inter
   from 
     docs p,
     ( select  '1996-1998' as  inter,  1996  as start_int ,  1998  as end_int  from dual
       union
       select  '1999-2002' as inter,  1999  as start_int,  2002  as end_int  from  dual
     ) d
  where
    to_number(to_char(p.doc_date,'yyyy')) between d.start_int and d.end_int
 )
 group by inter

SQLWKS> select
      2 >   inter, count(*)
      3 >  from
      4 >  (select d.inter
      5 >    from 
      6 >      docs p,
      7 >      ( select  '1996-1998' as  inter,  1996  as start_int ,  1998  as end_int  from dual
      8 >        union
      9 >        select  '1999-2002' as inter,  1999  as start_int,  2002  as end_int  from  dual
     10 >      ) d
     11 >   where
     12 >     to_number(to_char(p.doc_date,'yyyy')) between d.start_int and d.end_int
     13 >  )
     14 >  group by inter
     15 > 
     16 > 
     17 > 
INTER     COUNT(*)  
 --------- ----------
 
 1996 - 1998       532557 
 1999 - 2002       798405 
Выбрано  2  строк.
...
Рейтинг: 0 / 0
20.05.2003, 13:20:00
    #32163944
raven13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
select
(case when (to_char(vvod, 'yyyy')>='1994' and to_char(vvod, 'yyyy')<'1998') then '1994_1998'
when (to_char(vvod, 'yyyy')>='1998' and to_char(vvod, 'yyyy')<'2000') then '1998_2000'
when (to_char(vvod, 'yyyy')>='2000' and to_char(vvod, 'yyyy')<'2003') then '2000_2003'
else 'others'
end), count(*)
from ttt
group by
(case when (to_char(vvod, 'yyyy')>='1994' and to_char(vvod, 'yyyy')<'1998') then '1994_1998'
when (to_char(vvod, 'yyyy')>='1998' and to_char(vvod, 'yyyy')<'2000') then '1998_2000'
when (to_char(vvod, 'yyyy')>='2000' and to_char(vvod, 'yyyy')<'2003') then '2000_2003'
else 'others'
end)
...
Рейтинг: 0 / 0
20.05.2003, 13:21:07
    #32163949
DimaR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
Есть еще CASE
...
Рейтинг: 0 / 0
20.05.2003, 16:20:58
    #32164210
Andrej
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
Все спасибо,

так то оно так, в общем то очевидно,
а если неизвестно какой диапазон значений?
В этом то вся и фишка, иначе бы и не писал в форум.

Может какая-либо аналитичсекая функция есть?
...
Рейтинг: 0 / 0
20.05.2003, 16:25:50
    #32164221
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
"а если неизвестно какой диапазон значений? "

to Andrej:

Может я чего-то не понимаю, может одно из двух - а если ты сам не знаешь какие тебе нужны диапазоны, кто тогда знает?

Ответь мне на простой вопрос: сколько всего диапазонов между 1993 и 2003 годом?

Правильно - неизвестно. Поскольку в вопросе не указаны критерии на параметры диапазона.
...
Рейтинг: 0 / 0
20.05.2003, 16:26:15
    #32164223
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
Поясни, что значит "неизвестно какой диапазон значений"?
...
Рейтинг: 0 / 0
20.05.2003, 16:31:10
    #32164232
Violina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
to Andrej

Вариант Дениса работает для любого интервала дат разбивая его на диапазоны длиною 5 лет.
...
Рейтинг: 0 / 0
20.05.2003, 17:05:25
    #32164282
Sintetik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
Я так сильно подозреваю, что имеется ввиду непрерывные диапазоны
т.е. если есть данные с 1993,1994,1995, 1997,1998,1999 то будет
2 диапазона 1993-1995 и 1997-1999, а если внести строку с 1996, то станет 1 диапазон, и заранее их определить нельзя,
Хотя вообще-то спрашивающий должен точнее формулировать.
...
Рейтинг: 0 / 0
20.05.2003, 22:42:20
    #32164500
vskv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
2 Andrej: Если неизвестно какой диапазон значений , тогда делаешь

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or replace 
function year2hash (pYear date) return integer 
is 
begin
 return (EXTRACT(year FROM pYear))/ 5 ;
    -- to_number(to_char(year,%af_src_str_0))
 
end;

Select count(*) from ttt group by year2hash(vvod); 

...
Рейтинг: 0 / 0
21.05.2003, 11:50:06
    #32164843
Andrej
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
Да, у Дениса идея правильная,
вот так работает:

Код: plaintext
1.
2.
3.
4.
5.
select bottom||' - '||top interval, count(*)
from 
(select year(y) - mod(year(y),  5 ) bottom
, year(y) +  4  - mod(year(y),  5 ) top
from ttt)
group by bottom||' - '||top ;
...
Рейтинг: 0 / 0
21.05.2003, 13:35:15
    #32165034
raven13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
2 Andrej
Так бы и сказал сразу что по пять лет делить надо, а то городишь про неизвестный диапазон значений
...
Рейтинг: 0 / 0
21.05.2003, 16:53:47
    #32165377
Chira
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый запрос с группировкой
Еще универсальный вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT yy* 5 ||' - '||((yy+ 1 )* 5  - 1 ),cn
FROM (
SELECT FLOOR(YEAR/ 5 ) yy,COUNT(*) cn 
FROM AA
GROUP BY FLOOR(YEAR/ 5 )
)	
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хитрый запрос с группировкой / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]