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

Вот такие данные:
month fio sum
01 AA 200
01 AA 300
03 BB 400
05 CC 100

Нужно получить:
Count_month fio sum
3 AA 200
0 AA 300
0 BB 400
0 CC 100

Сделал запрос вида
select Count(DISTINCT MONTH) over() KOL_MONTH, FIO, SUM FROM tab1

Запрос выдает:
Count_month fio sum
3 AA 200
3 AA 300
3 BB 400
3 CC 100

Как исправить запрос?
29 окт 08, 09:09    [6368377]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить запрос  [new]
Добрый Э - Эх
Guest
case + row_number() тебе в помощь
29 окт 08, 09:12    [6368390]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить запрос  [new]
Elic
Member

Откуда:
Сообщений: 29991
тебе в помощь
RTFM
29 окт 08, 09:13    [6368395]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить запрос  [new]
Добрый Э - Эх
Guest
Ну или [LEAD() | LAG()] over()
29 окт 08, 09:14    [6368397]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить запрос  [new]
Добрый Э - Эх
Guest
funver
Как исправить запрос?

with tab1 as (
select '01' as month, 'AA' as fio, 200 as summ from dual union all
select '01' as month, 'AA' as fio, 300 as summ from dual union all
select '03' as month, 'BB' as fio, 400 as summ from dual union all
select '05' as month, 'CC' as fio, 100 as summ from dual)
select decode(lag(month) over(order by month, fio, summ),
              null, count(distinct month) over(),0) as x_cnt,
       tab1.*
  from tab1
29 окт 08, 09:19    [6368415]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить запрос  [new]
funver
Guest
Нашел следующее решение:
select DECODE(row_number() over(order by FIO),1,Count(DISTINCT MONTH) over(),0) KOL_MONTH, FIO, SUM FROM tab1
Может можно как-то упростить запрос?
29 окт 08, 09:20    [6368419]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить запрос  [new]
Elic
Member

Откуда:
Сообщений: 29991
funver
Может можно как-то упростить запрос?
Нет. Но нужно сделать правильнее:
... order by row_number() over(order by FIO)
29 окт 08, 09:25    [6368446]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить запрос  [new]
Andrei Fomichev
Member

Откуда: Москва
Сообщений: 453
Elic
... order by row_number() over(order by FIO)

Не понятно.
Имеется в виду
with tab1 as (
select '01' as month, 'AA' as fio, 200 as summ from dual union all
select '01' as month, 'AA' as fio, 300 as summ from dual union all
select '03' as month, 'BB' as fio, 400 as summ from dual union all
select '05' as month, 'CC' as fio, 100 as summ from dual)
select DECODE(row_number() over(order by row_number() over(order by FIO)),1,Count(DISTINCT MONTH) over(),0) KOL_MONTH, FIO, SUMm 
FROM tab1
?
если да, то этот запрос выдает ошибку
[1]: (Error): ORA-30483: window  functions are not allowed here
29 окт 08, 09:32    [6368480]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить запрос  [new]
Elic
Member

Откуда:
Сообщений: 29991
Andrei Fomichev
Elic
... order by row_number() over(order by FIO)
Не понятно. Имеется в виду.. ?
Нет
Правило бритвы оккама + RTFM However, the order_by_clause of the analitic function does not guarantee the order of the result (FAQ)
29 окт 08, 09:51    [6368599]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить