powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хитрый запрос с группировкой
14 сообщений из 14, страница 1 из 1
Хитрый запрос с группировкой
    #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
Хитрый запрос с группировкой
    #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
Хитрый запрос с группировкой
    #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
Хитрый запрос с группировкой
    #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
Хитрый запрос с группировкой
    #32163949
DimaR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще CASE
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой
    #32164210
Andrej
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все спасибо,

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

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

to Andrej:

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

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

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

Вариант Дениса работает для любого интервала дат разбивая его на диапазоны длиною 5 лет.
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой
    #32164282
Sintetik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так сильно подозреваю, что имеется ввиду непрерывные диапазоны
т.е. если есть данные с 1993,1994,1995, 1997,1998,1999 то будет
2 диапазона 1993-1995 и 1997-1999, а если внести строку с 1996, то станет 1 диапазон, и заранее их определить нельзя,
Хотя вообще-то спрашивающий должен точнее формулировать.
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой
    #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
Хитрый запрос с группировкой
    #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
Хитрый запрос с группировкой
    #32165034
raven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Andrej
Так бы и сказал сразу что по пять лет делить надо, а то городишь про неизвестный диапазон значений
...
Рейтинг: 0 / 0
Хитрый запрос с группировкой
    #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
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Хитрый запрос с группировкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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