contract Договоры
------------
id int идентификатор договора, первичный ключ
type_id int тип договора, внешний ключ
id_client int клиент, внешний ключ
id_bank int банк, внешний ключ
stat int статус договора (0 - действующий, 1 - недействующий)
name varchar(30) номер договора
Нужно написать запрос, возвращающий список открытых договоров, пронумерованных по порядку (1,2,3,... без пропусков номеров) для каждого банка. Эти номера не содержатся в таблице, т.е. должны быть вычисляемым полем. Т.е., №№ 1,2,3, ..., N для банка A, 1,2,3, ..., N для банка B, и т.д.
Рейт
150
Не знаю SQL
22
Когда-то изучал, но не в курсе
12
Знаю, как помочь, ответ ниже
35
Раздел: Программирование, проголосовало: 219, последний комментарий: 09.10.2011 14:00 Вопрос закрыт пользователем MiSsiS_IA
Это делается в лучшем случае несколькими запросами!
1. Получаешь список уникальных id_bank с действующим договором.
2. По циклу получаешь из базы id идентификаторы договоров для каждого банка (полученного в пункте 1), При этом записи уже будут идти по порядку!!!
Вся проблема сводится как раз к тому, что это тестовое задание, и требуется решить задачу одним SELECT-запросом (разрешается использование вложенных под-запросов).
Интересный был тест, спс, я его прошел
как раз получилось одним запросом
Подсказка; используй переменные для нумерации по порядку и сортировку по id_bank
SELECT
*,
IF(@id_bank <> `id_bank`, @num := 1, @num := @num + 1) AS `num`,
@id_bank := `id_bank` AS `temp2`
FROM
`contract`,
(SELECT @id_bank := -1 AS `temp1`) AS `temp`
WHERE
`stat` = 0
ORDER BY
`id_bank`