Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > SQL запрос


Автор: noober1 21.3.2011, 09:17
Здравствуйте. Напомните пожалуйста как рабоать с датами.
Имеется

Клиент
++++++++++++++++++++
|     id_client     | ФИО         | 
++++++++++++++++++++
|    ...      |           ...             |  
++++++++++++++++++++

Заказ
++++++++++++++++++++++++++++
|     id     | id_client             |      Дата    |
++++++++++++++++++++++++++++
|    ...      |           ...             |        ...       |
++++++++++++++++++++++++++++

Нужно:
Вывести ФИО клиента который сделал более 2х заказов в марте 2011 года.

Автор: ziga 21.3.2011, 09:53
А база какая ?

Код

select k.ФИО
  from Клиент k
 inner join (select z.id_client, count(z.id) as c_count
               from Заказ z 
              where z.ДАта >= to_date('01.03.2010')
                and z.ДАта <= to_date('31.03.2010')
              group by z.id_client) t on t.id_client = k.id_client and t.c_count > 2

Автор: Akina 21.3.2011, 09:59
Цитата(noober1 @  21.3.2011,  10:17 Найти цитируемый пост)
как рабоать с датами

Один из наиболее зависимых от SQL-диалекта вопросов.

Автор: noober1 21.3.2011, 11:01
База на Access.
ziga, а я что-то и не подумал использовать такие условия для отбора по дате. Я пытался через функцию извленчь из даты месяц и год.

Автор: Akina 21.3.2011, 11:16
Разумнее использовать не два сравнения, а один 
Код

WHERE [Дата] BETWEEN #2011-03-01# AND #2011-03-31#

Автор: Zloxa 21.3.2011, 11:22
Цитата(Akina @  21.3.2011,  11:16 Найти цитируемый пост)
Разумнее 

я бы предпочел сравнение на строго-меньше первого числа след. месяца.

Мне кажется так железобетоннее, вдруйх к дате и время затешется, мало ведь кто констрейнты на датутаму накурчивает, мол только дата.

Автор: noober1 21.3.2011, 13:13
А без INNER JOIN можно както сделать, использую обычное соединение?

Автор: Zloxa 21.3.2011, 13:15
Цитата(noober1 @  21.3.2011,  13:13 Найти цитируемый пост)
А без INNER JOIN можно както сделать

можно, используя кроелированный скалярный подзапрос. Но нужно ли?
Цитата(noober1 @  21.3.2011,  13:13 Найти цитируемый пост)
использую обычное соединение? 

что не обычного вам кажется в Inner join?

Автор: noober1 21.3.2011, 15:11
Zloxa, если не составит труда можете написать этот кроелированный скалярный подзапрос?

Автор: Zloxa 21.3.2011, 15:21
Если сможете хоть как-то обосновать необходимость того - пожалуйста.
А так - гадостям учить не склонен.

Автор: noober1 21.3.2011, 19:20
Попробовал запросик который любезно написал ziga - не работает.
Аксес не знайет функцию to_date :(

Автор: Akina 21.3.2011, 20:00
Цитата(noober1 @  21.3.2011,  20:20 Найти цитируемый пост)
Аксес не знайет функцию to_date :( 

CDate()

Автор: noober1 21.3.2011, 20:17
Спасибо. Теперь работает, но ругается на
Код

and t.c_count > 2

"Не поддерживается выражение объеденения"
Не подскажите в чем проблема?

Автор: noober1 30.3.2011, 11:34
Помогите еще один запросик сделать. 
Нужно получить ФИО агентов, которые не заказывали Электронику. 
Код

SELECT DISTINCT fio, 
FROM agent AS a, zakaz AS z
WHERE a.id_ag=z.id_ag AND type NOT IN
(SELECT id FROM typedetali WHERE name='Электроника');


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

Автор: Zloxa 30.3.2011, 11:51
Цитата(noober1 @  30.3.2011,  11:34 Найти цитируемый пост)
получить ФИО агентов, которые не заказывали Электронику. 

Код

SELECT fio, 
FROM agent AS a, zakaz AS z,
WHERE a.id_ag=z.id_ag 
group by fio
having count( case when z.type IN (SELECT id FROM typedetali WHERE name='Электроника')  then 1 end) = 0

Автор: noober1 30.3.2011, 12:41
Ошибку выдает
Код

Ошибка синтаксиса (Пропущен оператор) в выражении запроса having count( case when z.type IN (SELECT id FROM typedetali WHERE name='Электроника')  then 1 end) = 0

Автор: Akina 30.3.2011, 12:53
Не, Аксессовский SQL такое не съест smile 

Автор: Zloxa 30.3.2011, 13:19
Код

SELECT fio
FROM agent AS a, zakaz AS z,(SELECT id FROM typedetali WHERE name='Электроника')  s
WHERE a.id_ag=z.id_ag 
group by fio
having sum( iif(z.type = s.id,1,0)) = 0

Автор: noober1 30.3.2011, 13:29
Zloxa, блин опять не работает ((
Код

Ошибка синтаксиса в предложении FROM 

Автор: Akina 30.3.2011, 13:41
noober1, сделай его подзапрос статическим и впиши как источник.

Автор: Zloxa 30.3.2011, 13:45
Цитата(noober1 @  30.3.2011,  13:29 Найти цитируемый пост)
не работает 

user posted image

Автор: noober1 31.3.2011, 15:45
Сам ступил. действительно работает. спасибо!

Автор: noober1 31.3.2011, 17:03
Блин ребят, последний запросик. Сам уже всю голову обламал как сделать.
Нужно получить ФИО агентов, которые заказывали товары только одного типа.

Автор: Zloxa 31.3.2011, 17:18
Цитата(noober1 @  31.3.2011,  17:03 Найти цитируемый пост)
заказывали товары только одного типа. 

having count(dsitinct z.type) = 1

Добавлено через 56 секунд
вы, кстати, уверены что задачи для акцесса?

Автор: noober1 31.3.2011, 17:45
Да в аксесс.
Код

SELECT fio
FROM agent AS a, zakaz AS z
WHERE a.id_ag=z.id_ag 
GROUP BY fio
HAVING count (distinct z.itype) =1

Пишет что пропущен оператор в выражении запроса count (distinct z.itype) =1

Автор: Zloxa 31.3.2011, 21:05
Цитата(noober1 @  31.3.2011,  17:45 Найти цитируемый пост)
Да в аксесс.

Это же домашка какая то, я правильно понимаю?

Задачи на столько типовые, что явно в них видится домашка. Обычно домашние задания предназначены для того чтобы учиться делать правильно. Однако задания, которые вам предложены, в акцессе правильно не делются в силу ограничений платформы. Было бы очень странно, если бы вас изначально учили чесать левое ухо правой рукой через голову. Потому и возникает резонный вопрос, вы действительно используете ту платформу, которая требуется для решения?

По существу... У меня дома акцесс не стоит, завтра на работе покумекаю как эта задачка может решаится с учетом ограничений акцесса

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)