Нужна помощь с запросом...

Gennady_
Дата: 07.03.2016 19:01:26
Хай олл,
есть такой набор записей:
Name event Name student Result
1500 m Finals Zori Seymour 73814
1500 m Finals An Mei Daniels 71015
1500 m Finals Siena Jabon 80512
1500 m Finals Catherine Camara 80100
1500 m Finals Taylor Crichlow 81510
1500 m Finals Jessica Bruton 70425
1500 m Finals Tayla Horan 74623
1500 m Finals Ahziah Hunt 63025
200 m Finals Ahziah Hunt 3410
200 m Finals Jessie Daba 3512
200 m Finals Lexiana Tucci 3608
400 m Finals Zemira Webb 13212
400 m Finals Siena Jabon 12516
400 m Finals Elsie Hastings 12015
400 m Finals Zori Seymour 12823

мне надо получить:
Name event 1st 2nd 3rd
1500 m Finals Ahziah HuntJessica BrutonAn Mei Daniels
и т.д.
Подскажите, как сделать красиво одним запросом?
непоймучка
Дата: 07.03.2016 19:34:55
в таком духе
TRANSFORM MIN(NameStudent)
SELECT NameEvent
FROM
(SELECT T.NameEvent,T.NameStudent,T.Result,Count(1) As ord
 FROM Tabl1 T INNER JOIN Tabl1 T1
 ON T1.NameEvent=T.NameEvent AND T1.Result<=T.Result
 GROUP BY T.NameEvent,T.NameStudent,T.Result)
WHERE ord<=3
GROUP BY NameEvent
PIVOT ord
Gennady_
Дата: 07.03.2016 20:49:19
непоймучка, спасибо большое. Всё как надо. Мастер.
Gennady_
Дата: 09.03.2016 17:56:14
непоймучка, однако при одинаковых результатах подзапрос возвращает такое:
Name discipline Name student Result Ord
High Jump Dylan Thomas 411 1
High Jump Nicholas Massa 403 2
High Jump Matthew Jessey 402 5
High Jump DeAndre Todd 402 5
High Jump Ajani Richardson 402 5
High Jump Thomas McPhee 401 7
High Jump Logan Thompson 401 7
High Jump Joshua Roberts 311 9
High Jump Charlie Thorpe 311 9
High Jump Kent Simmons 310 10
High Jump Ahzai Smith 309 11
High Jump Adam McDonald 308 12
High Jump CJ Sousa-Saints 305 14
High Jump Cameron Pollett 305 14


а нужно конечно так:

Name discipline Name student Result Ord
High Jump Dylan Thomas 411 1
High Jump Nicholas Massa 403 2
High Jump Matthew Jessey 402 3
High Jump DeAndre Todd 402 3
High Jump Ajani Richardson 402 3
High Jump Thomas McPhee 401 4
High Jump Logan Thompson 401 4
High Jump Joshua Roberts 311 5
High Jump Charlie Thorpe 311 5
High Jump Kent Simmons 310 6
High Jump Ahzai Smith 309 7
High Jump Adam McDonald 308 8
High Jump CJ Sousa-Saints 305 9
High Jump Cameron Pollett 305 9

подскажи, куда копать...
guest_rusimport
Дата: 09.03.2016 20:13:27
Gennady_,
может быть такой подзапрос? :)
select t3.nameevent,t3.namestudent,t3.result,t4.ord from tabl1 as t3 inner join (SELECT t1.nameevent, t1.result, count(1) AS ord
FROM (SELECT Tabl1.Nameevent,  Tabl1.Result
FROM Tabl1 GROUP BY Tabl1.Nameevent, Tabl1.Result) AS t1 INNER JOIN (SELECT Tabl1.Nameevent,  Tabl1.Result
FROM Tabl1 GROUP BY Tabl1.Nameevent, Tabl1.Result) AS t2 ON (t2.result<=t1.result) AND (t1.nameevent=t2.nameevent)
GROUP BY t1.Nameevent, t1.Result) as t4 on t3.nameevent=t4.nameevent and t3.result=t4.result
order by t3.nameevent,t3.result,t3.namestudent;
Gennady_
Дата: 09.03.2016 20:43:39
guest_rusimport, Спасибо.
Вроде работает, сейчас протестирую с бОльшим количеством данных.
часто бываю на http://am.rusimport.ru. Очень помогает, спасибо еще раз.
непоймучка
Дата: 09.03.2016 23:01:00
Gennady_
непоймучка, однако при одинаковых результатах подзапрос возвращает такое:
Name discipline Name student Result Ord
High Jump Dylan Thomas 411 1
High Jump Nicholas Massa 403 2
High Jump Matthew Jessey 402 5
High Jump DeAndre Todd 402 5
High Jump Ajani Richardson 402 5
High Jump Thomas McPhee 401 7
High Jump Logan Thompson 401 7
High Jump Joshua Roberts 311 9
High Jump Charlie Thorpe 311 9
High Jump Kent Simmons 310 10
High Jump Ahzai Smith 309 11
High Jump Adam McDonald 308 12
High Jump CJ Sousa-Saints 305 14
High Jump Cameron Pollett 305 14


а нужно конечно так:

Name discipline Name student Result Ord
High Jump Dylan Thomas 411 1
High Jump Nicholas Massa 403 2
High Jump Matthew Jessey 402 3
High Jump DeAndre Todd 402 3
High Jump Ajani Richardson 402 3
High Jump Thomas McPhee 401 4
High Jump Logan Thompson 401 4
High Jump Joshua Roberts 311 5
High Jump Charlie Thorpe 311 5
High Jump Kent Simmons 310 6
High Jump Ahzai Smith 309 7
High Jump Adam McDonald 308 8
High Jump CJ Sousa-Saints 305 9
High Jump Cameron Pollett 305 9

подскажи, куда копать...


Это да.
Хотел вам вдогонку про это написать, но сразу не случилось, а потом думал, что обошлось

Тут, помимо той проблемы, которую вам guest_rusimport уже порешал своим вариантом подзапроса,
есть еще такой момент, что в случае повторяющихся результатов, есть сложности с тем,
чтобы на выходе transform'а получить имена участников с такими результатами в одной ячейке
(т.е. на одном "месте"), ибо в группирующих запросах MSA отсутствуют штатные средства
конкатенации текстовых значений группируемых строк.

Лишь при попарно повторяющихся результатах, пару победителей можно объединить,
используя штатные конструкции SQL - например как TRANSFORM Min(...) & " " & Max(...)

Но если их будет более двух (т.е. в общем случае), то подобным приемом не отделаться.

В принципе, тут на форуме есть ряд топиков с примерами функций для конкатенации текстовых
значений в группирующих запросах, поищите, прожует ли их TRANSFORM, надо пробовать.
Gennady_
Дата: 14.03.2016 00:11:26
непоймучка,
Спасибо что откликнулись, трансформировать не обязательно, главное правильно раздать места.
Photografer
Дата: 14.03.2016 10:06:51
непоймучка,здравствуйте. Не подскажете, как мне отфильтровать текстовые поля, чтобы не было пустых полей. Только не кодом программы. А когда открываю запрос, там таблица высвечивается и туда надо написать условие отбора. Вот что туда написать, чтобы отображались только не пустые текстовые поля?