Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите с SQL-запросом

19K
02 августа 2007 года
Vanzo
16 / / 15.07.2007
проблема такая
есть таблица сделок: столбцы компания и дата
надо получить таблицу, выбрав последние 3 сделки для каждой компании
как это делается SQL-запросом, подскажите пжлста, и делается ли вообще?
работаю с бд Access
294
02 августа 2007 года
Plisteron
982 / / 29.08.2003
Долго думал, пришёл к выводу:
 
Код:
select * from
(
SELECT  r1.Компания, r1.Дата, (select count(*) from комдата as rr where rr.Компания =  r1.Компания and rr.Дата >= r1.Дата) AS xx
FROM комдата AS r1
ORDER BY r1.Компания, r1.Дата DESC
)
where xx <=3;


Мда... под Oracle такие вещи решаются проще...
309
02 августа 2007 года
el scorpio
1.1K / / 19.09.2006
Читаем хелп по M$ Access
Цитата:
TOP - Возвращает определенное число записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY. Следующая инструкция SQL позволяет получить список 25 лучших студентов выпуска 1994 года:
SELECT TOP 25
Имя, Фамилия
FROM Студенты
WHERE ГодВыпуска = 1994
ORDER BY СреднийБалл DESC;

Если предложение ORDER BY будет опущено, запрос возвратит произвольный набор 25 записей из таблицы &#171;Студенты&#187;, удовлетворяющих предложению WHERE.

Предикат TOP не осуществляет выбор между равными значениями. Если в предыдущем примере средние баллы двадцать пятого и двадцать шестого студента будут равны, то запрос возвратит 26 записей.


Как выбрать для одной компании последние 3 сделки - легко и просто. А вот как выбрать для ВСЕХ - тут надо думать...
А нельзя просто в самой программе сделать цикл по всем компаниям?

19K
02 августа 2007 года
Vanzo
16 / / 15.07.2007
el_scorpio спасибо, я это видел, но применить сюда не получилось
Plisteron спасибо большое
309
03 августа 2007 года
el scorpio
1.1K / / 19.09.2006
Кстати, в Аксесе конструкцию из цепочки SELECT'ов можно записать в виде НЕСКОЛЬКИХ простых запросов, которые будут вызывать друг-друга.
 
Код:
//Запрос1
SELECT * FROM Запрос2
WHERE where xx <=3

//Запрос2
SELECT  r1.Компания, r1.Дата, (select count(*) from комдата as rr where rr.Компания =  r1.Компания and rr.Дата >= r1.Дата) AS xx
FROM комдата AS r1
ORDER BY r1.Компания, r1.Дата DESC

Чуть-чуть читабельнее :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог