Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нестандартный TOP
 
 автор: Mak&S   (12.10.2007 в 11:00)   личное сообщение
 
 

Есть куча клиентов. У них куча заказов.
Задача - вывести не больше двух первых заказов каждого клиента. У меня только один вариант возникает - VBA код со вставкой первых двух записей из рекордсета во временную таблицу.
Можно решить эту задачу запросами?

  Ответить  
 
 автор: osmor   (12.10.2007 в 11:41)   личное сообщение
 
 

select top 2 ...

  Ответить  
 
 автор: Mak&S   (12.10.2007 в 11:46)   личное сообщение
 
 

допустим 100 клиентов с 3-мя заказами каждый - итого 300 заказов.
Мне надо вывести 100 клиентов с первыми 2-мя - Итого 200 записей.

select top 2 ... выведет только 2 записи

  Ответить  
 
 автор: osmor   (12.10.2007 в 13:16)   личное сообщение
 
 

Предположим что есть таблицы:
tblClients - клиенты
idClient - код Клиента
NameClient - Название ......

tblOrders - заказа
IdOrder - код заказа
dtOrder - дата заключения заказа
.....

Тогда запрос:

SELECT tblClients.idClient, 
(select top 1 idOrder 
      from tblOrders 
      where tblClients.idClient = tblOrders.idClient 
      order By dtOrder) AS OrderID
FROM tblClients
Union
SELECT tblClients.idClient, 
(select top 1 idOrder 
      from tblOrders 
     where tblClients.idClient = tblOrders.idClient  
     and  tblOrders.id not in (select top 1 idOrder 
                                          from tblOrders 
                                          where tblClients.idClient = tblOrders.idClient 
                                          order By dtOrder) 
      Order By dtOrder ) AS OrderID
FROM tblClients


Вернет коды клиентов и соответвующие им коды первых двух (по дате заключения) заказов

  Ответить  
 
 автор: Mak&S   (12.10.2007 в 15:16)   личное сообщение
 
 

Ну голова!!!! Чуял что UNION надо юзать но как???
СПАСИБО

  Ответить  
 
 автор: Анатолий (Киев)   (15.10.2007 в 10:39)   личное сообщение
 
 

Еще вариант попроще:
SELECT ЗаказID FROM Заказы GROUP BY КлиентID, ЗаказID HAVING (((Count(*))<=2));

Можно добавить и другие поля (группировка по всем).
Можно изменить ограничение количества, а добавив ORDER BY ДатаЗаказа DESC, получить последние заказы.

  Ответить  
 
 автор: osmor   (15.10.2007 в 11:48)   личное сообщение
 
 

ага!
не допер

  Ответить  
 
 автор: Mak&S   (16.10.2007 в 15:46)   личное сообщение
 
 

Не соглашусь с
"SELECT ЗаказID FROM Заказы GROUP BY КлиентID, ЗаказID HAVING (((Count(*))<=2))"
Этот запрос выведет все заказы клиентов.

Если убрать из группировки ЗаказID, то этот запрос выведет клиентов у которых не более 2 заказов. А задача вывести первые 2.

Osmor рулит forever

  Ответить  
 
 автор: Анатолий (Киев)   (16.10.2007 в 16:15)   личное сообщение
 
 

А так?
SELECT Min(ЗаказID), Max(ЗаказID), КлиентID FROM Заказы GROUP BY КлиентID;
Или First(), Last()

  Ответить  
 
 автор: osmor   (16.10.2007 в 16:34)   личное сообщение
 
 

странно, а мне показалось что должно получиться...
Если использовать функцию типа как в нумерации строк
http://hiprog.com/index.php?option=com_content&task=view&id=378&Itemid=35
то запрос получится проще

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList