Запрос

СУ-30
Дата: 06.06.2006 19:49:09
Как сделать так чтобы в результате было так:

Имеем результат запроса вида

П1 П2 П3 П4 П5 П6
1что-точто-то10200
1что-точто-то20300
1что-точто-то30400
2что-точто-то40400
3что-точто-то50500
4что-точто-то60600
4что-точто-то70700
5что-точто-то90900
5что-точто-то1001000


НАДО ПОЛУЧИТЬ В ТАКОМ ВИДЕ

П1 П2 П3 П4 П5 П6
1что-точто-то60900
что-точто-то
что-точто-то
2что-точто-то40400
3что-точто-то50500
4что-точто-то1301300
что-точто-то
5что-точто-то1901900
что-точто-то


последний столбец (П6) вычисляется как:
- если СУММ(П4) по одному и тому же ИД МИНУС СУММ(П5) по одному и тому же ИД РАВНО или БОЛЬШЕ нуля, то оставляем РАЗНИЦУ
- если МЕНЬШЕ НУЛЯ, то ставим НОЛЬ

P.S. ТУТ ТАК ЦИФРЫ не совсем удачно подобрал для примера, что в последнем столбце для всех ноль получается.
СУ-30
Дата: 06.06.2006 19:57:52
Уточню, что ПЕРВАЯ таблица это МОЙ РЕЗУЛЬТАТ ЗАПРОСА, который надо привести к виду, как в таблице ВТОРОЙ.
dmidek
Дата: 06.06.2006 20:07:20
Два соображения
1. Я не вводил колонки с "что то" - это неважно. Добавьте их сами
2. Непонятно, какая из колонок в рамках П1 "первая".
Я расположил их случайным образом

select decode(p1,lag_p1,NULL,p1),decode(p1,lag_p1,NULL,sum_p4),
        decode(p1,lag_p1,NULL,sum_p5), decode(p1,lag_p1,NULL,sign_diff) 
 from
 (select p1, lag(p1) over (partition by p1 order by p1) lag_p1, sum(p4) over (partition by p1) sum_p4, 
        sum(p5) over (partition by p1) sum_p5,  decode(sign(p4-p5),1,p4-p5,0) sign_diff
 from tab
 )
 order by p1

1                                       	60                                      	90                                      	0


2 40 40 0
3 50 50 0
4 130 130 0

5 190 190 0
dmidek
Дата: 06.06.2006 20:16:45
dmidek

2. Непонятно, какая из колонок в рамках П1 "первая".


Описка. Имелось в виду конечно "из строк"
dmidek
Дата: 06.06.2006 20:23:12
dmidek

select decode(p1,lag_p1,NULL,p1),decode(p1,lag_p1,NULL,sum_p4),
        decode(p1,lag_p1,NULL,sum_p5), decode(p1,lag_p1,NULL,sign_diff) 
 from
 (select p1, lag(p1) over (partition by p1 order by p1) lag_p1, sum(p4) over (partition by p1) sum_p4, 
        sum(p5) over (partition by p1) sum_p5,  decode(sign(p4-p5),1,p4-p5,0) sign_diff
 from tab
 )
 order by p1


И еще поторопился. Знак по сумме

select decode(p1,lag_p1,NULL,p1),decode(p1,lag_p1,NULL,sum_p4),
        decode(p1,lag_p1,NULL,sum_p5), decode(p1,lag_p1,NULL,decode(sign(sum_p4-sum_p5),1,sum_p4-sum_p5,0)) sign_diff 
 from
 (select p1, lag(p1) over (partition by p1 order by p1) lag_p1, sum(p4) over (partition by p1) sum_p4, 
        sum(p5) over (partition by p1) sum_p5 from tab
 )
 order by p1
Elic
Дата: 06.06.2006 20:26:15
dmidek
decode(sign(sum_p4-sum_p5),1,sum_p4-sum_p5,0)) sign_diff 
greatest(0, sum_p4-sum_p5) as sign_diff
dmidek
Дата: 06.06.2006 23:04:01
Elic
dmidek
decode(sign(sum_p4-sum_p5),1,sum_p4-sum_p5,0)) sign_diff 
greatest(0, sum_p4-sum_p5) as sign_diff

Конечно, Elic, так красивее.
Никак не переведу greatest и least в активный словарный запас :)