powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Еще одна головоломка.
8 сообщений из 8, страница 1 из 1
Еще одна головоломка.
    #37370087
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adaptive Server Enterprise/15.0.3/EBF 17775 ESD#4/P/RS6000/AIX 5.3/ase1503/2768/64-bit/FBO/Thu Aug 26 07:36:52 2010

Есть табличка, с двухуровневой группировкой (по id и d_number), внутри групп второго уровня идет замещение строк.
Надо сгруппировав по id (первый уровень) получить максимальную дату d_date внутри группы и сумму amount внутри группы.

Иными словами, имеется таблица:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table #t (
    id integer,
    d_number integer,
    d_date date,
    amount money
)
insert into #t values( 1 ,  1 , '01/01/2011',  10 )
insert into #t values( 1 ,  2 , '02/01/2011',  10 ) // игнорировать
insert into #t values( 1 ,  2 , '03/01/2011',  10 )
insert into #t values( 2 ,  1 , '01/01/2011',  20 ) // игнорировать
insert into #t values( 2 ,  1 , '02/01/2011',  15 ) // игнорировать 
insert into #t values( 2 ,  1 , '03/01/2011',  10 )
insert into #t values( 2 ,  2 , '01/01/2011',  10 )
Надо получить:
id date sum1 03/01/2011 202 03/01/2011 20
То есть, если в id группе есть несколько строк с одинаковым d_number, то участвовать в суммировании должна только строка с максимальным d_date...
...
Рейтинг: 0 / 0
Еще одна головоломка.
    #37370385
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 28.07.2011 3:00, White Owl wrote:
> Есть табличка, с двухуровневой группировкой (по id и d_number), внутри групп
> второго уровня идет замещение строк.

Это что ж тебе писать запрос что ли ?
Ну не позорься, ты ж запросы сам умеешь писать.
Сила воли только нужна.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Еще одна головоломка.
    #37370963
Misha_LV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
select t1.id,sum(if t1.d_date=t2.mdate then amount else  0  endif)
from #t as t1, lateral
(select id,d_number,max(d_date) as mdate from #t where #t.id=t1.id and #t.d_number=t1.d_number
group by id,d_number) as t2
group by t1.id;

данное решение было на версии с ASA 9 .
...
Рейтинг: 0 / 0
Еще одна головоломка.
    #37371400
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivOn 28.07.2011 3:00, White Owl wrote:
> Есть табличка, с двухуровневой группировкой (по id и d_number), внутри групп
> второго уровня идет замещение строк.

Это что ж тебе писать запрос что ли ?
Ну не позорься, ты ж запросы сам умеешь писать.
Сила воли только нужна.
Зачем мучиться в шесть вечера, если можно опубликовать задачку и к утру следующего рабочего дня возможно получить ответ? :)


Misha_LV, внимательней надо быть. В первой строке моего поста указана версия сервера.
Решение для SA это хорошо, но ASE его не понимает...
...
Рейтинг: 0 / 0
Еще одна головоломка.
    #37371648
Misha_LV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно вот так,неужели и так на ASE не понимает?Писал оба запроса на версии ASA 9 .
Код: plaintext
1.
2.
3.
4.
select t1.id,sum(if t1.d_date=t2.mdate then amount else  0  endif)
from #t as t1 left outer join
(select id,d_number,max(d_date) as mdate from #t 
group by id,d_number) as t2 on ( t1.id=t2.id and t1.d_number=t2.d_number)
group by t1.id;
...
Рейтинг: 0 / 0
Еще одна головоломка.
    #37371771
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha_LVМожно вот так,неужели и так на ASE не понимает?Не понимает. Ну нету в Transact SQL функции if, нэту...
Впрочем, если заменить if на case, то вроде как даже работает...
А зачем ты left join сделал? Там простой join лучше будет.
Код: plaintext
1.
2.
3.
4.
5.
6.
select
    t1.id,
    sum(case when t1.d_date=t2.mdate then amount else  0  end),
    max(t1.d_date)
from #t as t1
join (select id,d_number,max(d_date) as mdate from #t group by id,d_number) as t2 on ( t1.id=t2.id and t1.d_number=t2.d_number)
group by t1.id
вот как-то так...
...
Рейтинг: 0 / 0
Еще одна головоломка.
    #37371814
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Зато есть CASE, который в общем стандартный.
...
Рейтинг: 0 / 0
Еще одна головоломка.
    #37381740
Фотография shut-up-and-skate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно без case

Код: plaintext
1.
2.
3.
select g.id, max(g.d_date), sum(t.amount)
from (select id, d_number, max(d_date) as d_date from #t group by id, d_number) g
join #t t on (g.id = t.id and g.d_number = t.d_number and g.d_date = t.d_date)
group by g.id
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Еще одна головоломка.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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