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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Access 2003 Выборка по дате
 
 автор: Angel   (07.05.2009 в 12:35)   личное сообщение
 
 

Регистрационный номер: Дата составления:
01921 29.12.2007 12:17:38
01921 24.12.2007 15:04:07
01921 24.12.2007 15:00:49
01921 24.12.2007 14:57:04
01921 29.01.2008 10:16:07
01894 28.01.2008 9:16:14
01894 09.01.2008 12:17:21
01894 28.01.2008 9:17:02
01894 17.12.2007 13:44:53
01894 17.12.2007 13:45:16
01894 17.12.2007 12:14:19
01888 15.12.2007 15:44:29
01888 15.12.2007 15:43:54
01888 15.12.2007 15:43:33
01888 15.12.2007 15:39:40
01881 14.12.2007 14:14:03
01881 14.12.2007 14:20:04
01881 14.12.2007 14:19:33
01881 14.12.2007 14:19:16

В делах с номерами 01921 и 01894 используются документы с 2007 и 2008 годом, а в остальных только 2007 год. Что указать в запросе, чтобы выбрать все дела с двумя годами?

  Ответить  
 
 автор: osmor   (07.05.2009 в 12:58)   личное сообщение
 
 

как то так:

SELECT q1.reg, Count(q1.y) AS [y1]
FROM 
          (SELECT [Регистрационный номер] as reg , Year([Дата составления]) AS y
           FROM tbl
           GROUP BY tbl.[Регистрационный номер], Year([Дата составления])) AS q1
GROUP BY q1.reg
HAVING (Count(q1.y)>1);

  Ответить  
 
 автор: Angel   (07.05.2009 в 13:10)   личное сообщение
 
 

Можешь пояснить на примере, что куда написать?

SELECT CAODealRegs.RegNumber, CAODocs.DocDate
FROM CAODealRegs LEFT JOIN CAODocs ON CAODealRegs.ID = CAODocs.DealReg
WHERE (((CAODealRegs.RegNumber)="01921" Or (CAODealRegs.RegNumber)="01894" Or (CAODealRegs.RegNumber)="01888" Or (CAODealRegs.RegNumber)="01881"));

  Ответить  
 
 автор: osmor   (07.05.2009 в 14:22)   личное сообщение
 
 

какое отношение этот запрос имеет к поставленной задаче?

  Ответить  
 
 автор: Анатолий (Киев)   (07.05.2009 в 12:58)   личное сообщение
 
 

SELECT [Регистрационный номер], Min([Дата составления]), Max([Дата составления])
FROM Таблица
GROUP BY [Регистрационный номер]
HAVING (Min(Year([Дата составления]))<>Max(Year([Дата составления])));

или
HAVING (DateDiff('YYYY', Min([Дата составления]), Max([Дата составления]))<>0);

  Ответить  
 
 автор: osmor   (07.05.2009 в 14:21)   личное сообщение
 
 

красиво!!!!

  Ответить  
 
 автор: Angel   (08.05.2009 в 08:13)   личное сообщение
 
 

SELECT CAODealRegs.RegNumber, CAODocs.DocDate
FROM CAODealRegs LEFT JOIN CAODocs ON CAODealRegs.ID = CAODocs.DealReg

CAODealRegs.RegNumber - таблица из которой берется регистрационный номер,
CAODocs.DocDate - таблица из которой берется дата составления.
как должен выглядеть запрос, чтобы в итоге получить:
Регистрационный номер: Дата составления:
01921 29.12.2007 12:17:38
01921 24.12.2007 15:04:07
01921 24.12.2007 15:00:49
01921 24.12.2007 14:57:04
01921 29.01.2008 10:16:07
01894 28.01.2008 9:16:14
01894 09.01.2008 12:17:21
01894 28.01.2008 9:17:02
01894 17.12.2007 13:44:53
01894 17.12.2007 13:45:16
01894 17.12.2007 12:14:19

  Ответить  
 
 автор: osmor   (08.05.2009 в 08:50)   личное сообщение
 
 

если DealReg в таблице CAODocs это код из поля ID таблицы CAODealRegs, то встает еще один вопрос, Вы хотите получить все Записи из таблицы CAODealRegs, или только те у которых есть хотя бы одна соответствующая запись в таблице CAODocs?
Если все то ваш запрос правильный, если только те у которых есть хотя бы одна соответствующая запись в таблице CAODocs, то замените LEFT JOIN на INNER JOIN

  Ответить  
 
 автор: Angel   (08.05.2009 в 09:07)   личное сообщение
 
 

Наверное я неправильно объясняю.

Есть запрос
SELECT CAODealRegs.RegNumber, CAODocs.DocDate
FROM CAODealRegs LEFT JOIN CAODocs ON CAODealRegs.ID = CAODocs.DealReg

который выдает следующее
Регистрационный номер: Дата составления:
01921 29.12.2007 12:17:38
01921 24.12.2007 15:04:07
01921 24.12.2007 15:00:49
01921 24.12.2007 14:57:04
01921 29.01.2008 10:16:07
01894 28.01.2008 9:16:14
01894 09.01.2008 12:17:21
01894 28.01.2008 9:17:02
01894 17.12.2007 13:44:53
01894 17.12.2007 13:45:16
01894 17.12.2007 12:14:19
01888 15.12.2007 15:44:29
01888 15.12.2007 15:43:54
01888 15.12.2007 15:43:33
01888 15.12.2007 15:39:40
01881 14.12.2007 14:14:03
01881 14.12.2007 14:20:04
01881 14.12.2007 14:19:33
01881 14.12.2007 14:19:16

Мне нужно чтобы выдавал номера дел у которых в дате составления присутствуют два и более года(на мое усмотрение):
Регистрационный номер: Дата составления:
01921 29.12.2007 12:17:38
01921 24.12.2007 15:04:07
01921 24.12.2007 15:00:49
01921 24.12.2007 14:57:04
01921 29.01.2008 10:16:07
01894 28.01.2008 9:16:14
01894 09.01.2008 12:17:21
01894 28.01.2008 9:17:02
01894 17.12.2007 13:44:53
01894 17.12.2007 13:45:16
01894 17.12.2007 12:14:19

  Ответить  
 
 автор: osmor   (08.05.2009 в 09:20)   личное сообщение
 
 

можно так:

SELECT tbl.[Регистрационный номер], tbl.[Дата составления]
FROM tbl
WHERE (tbl.[Регистрационный номер] In (SELECT q1.reg
FROM (SELECT [Регистрационный номер] as reg , Year([Дата составления]) AS y
FROM tbl
GROUP BY tbl.[Регистрационный номер], Year([Дата составления])) AS q1
GROUP BY q1.reg
HAVING Count(q1.y)>[Более лет]));

  Ответить  
 
 автор: Анатолий (Киев)   (08.05.2009 в 11:51)   личное сообщение
 
 

Еще вариант:
SELECT CAODealRegs.RegNumber, CAODocs.DocDate
FROM CAODealRegs LEFT JOIN CAODocs ON CAODealRegs.ID = CAODocs.DealReg
WHERE EXISTS (SELECT * FROM CAODocs As tmp WHERE ((tmp.DealReg=CAODocs.DealReg)
AND (Abs(Year(CAODocs.DocDate)-Year(tmp.DocDate))>=1));

  Ответить  
 
 автор: Angel   (09.05.2009 в 03:41)   личное сообщение
 
 

В прикрепленном файле запрос. Попробую объяснить по другому, что мне нужно. Сейчас я делаю отчеты по документам с датой составления за 2009г. У дел начатых в 2009г. даты составления документов имеют 2009г, но есть дела начатые в 2008г., а оконченные в 2009г. (могут быть даже дела начатые в 2007г., а оконченные в 2009г.). Мне нужно выбрать дела с датой составления документов за 2009г, но при этом у дел за 2008г. должны показываться оба года. Простите, что файл такой большой, но убирать лишнее очень долго.
http://slil.ru/27521354

  Ответить  
 
 автор: Goblin   (09.05.2009 в 12:15)   личное сообщение
38 Кб.
 
 

Блин, 37МБ! Сделай копию, убери лишнию инфу, сожми в раре. Ибо сдохну от любопытства.

Вот накидал что получилось по форме и отчету. Без оформления. Отчет - регистрационный номер и год. В форме регистрационный номер и даты ведения. Попрет так?

  Ответить  
 
 автор: Angel   (09.05.2009 в 12:23)   личное сообщение
 
 

К сожалению, не могу

  Ответить  
 
 автор: Goblin   (09.05.2009 в 13:01)   личное сообщение
 
 

Да бог с ним. По тому что дал отчет и форма подошли? Такое имел в виду или я опять что-то не так понял.

  Ответить  
 
 автор: Angel   (09.05.2009 в 13:40)   личное сообщение
 
 

Если честно, я вообще не могу понят что ты сделал, но это точно не то, что мне нужно.

  Ответить  
 
 автор: Goblin   (09.05.2009 в 13:49)   личное сообщение
 
 

Мне нужно выбрать дела с датой составления документов за 2009г, но при этом у дел за 2008г. должны показываться оба года.

Так вроде указывается оба года в отчете, там где их оба. Или нужно только те, которые больше 2 лет ведуться?

  Ответить  
 
 автор: Angel   (09.05.2009 в 14:12)   личное сообщение
 
 

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

  Ответить  
 
 автор: Goblin   (09.05.2009 в 14:18)   личное сообщение
 
 

Ладно. К вечеру будет скачан. К утру ответ.

PS Кажется дошло. В запросе должно быть типа так:
Регистрационный номер Дата
0111101 2008,2009
0111000 2007
0234900 2006,2007,2008,2009
03338282 2008,2009

В таком виде вывод?

  Ответить  
 
 автор: Angel   (09.05.2009 в 14:50)   личное сообщение
 
 

Нет. Посмотри пожалуйста файл и напиши понятно или нет. Во второй таблице выделены дела, которых не должно быть в запросе, т.к. в этих делах нет 2009г.
http://slil.ru/27521851

  Ответить  
 
 автор: Goblin   (09.05.2009 в 15:59)   личное сообщение
 
 

Теперь ясно. 2 поля. В одном регистрационные, в другом даты. Нужно вывести те регистрационные, в которые входит дата 2009. При этом показать все даты, которые входят кроме 2009 если они там есть. Так? Кажется определились.

  Ответить  
 
 автор: Goblin   (09.05.2009 в 17:16)   личное сообщение
47 Кб.
 
 

Вот пока так. В поле формы вводишь год, регистрационные которого не надо выводить. Нажимая на кнопку выйдут все регстрационные, в которые введенный год не входит.
Импортируй в свою базу все запросы, переделай под свою таблицу. Скачать файл смогу только к вечеру. Если будет надо, то переведу сам под имя таблицы с ее полями. Главное это то или нет?

  Ответить  
 
 автор: Goblin   (09.05.2009 в 20:20)   личное сообщение
55 Кб.
 
 

Первое была шутка от гоблина. С точностью до наоборот. Даю второй вариант - введи год для вывода всех регистрационных, в которых интересуемый год присутствует хотя бы один раз. Также выведены будут все остальные года данного регистрационного.
PS В запросе выводится №регистрационный и года в формате Год. Запрос групповой.

  Ответить  
 
 автор: Angel   (10.05.2009 в 06:35)   личное сообщение
 
 

Спасибо за попытки помочь, но ты так и не понял, что мне нужно.

  Ответить  
 
 автор: snipe   (10.05.2009 в 06:55)   личное сообщение
 
 

Погоди несколько минут - не убегай

  Ответить  
 
 автор: snipe   (10.05.2009 в 07:04)   личное сообщение
10 Кб.
 
 

Может так подойдет - то что (как мне кажется) Вам нужно во втором запросе.....
таблиц нет вообще (я убрал все данные для уменьшения объема файла).....
так что - то что я вам прислал нужно вставить в Копию вашей базы

  Ответить  
 
 автор: Angel   (10.05.2009 в 07:16)   личное сообщение
 
 

Я прошу помочь сделать в запросе, а вы снова используете форму. Мне это не нужно.

  Ответить  
 
 автор: snipe   (10.05.2009 в 07:19)   личное сообщение
 
 

Там форма случайно затесалась.......
весь процесс в запросе1 и запросе2

  Ответить  
 
 автор: Angel   (10.05.2009 в 07:26)   личное сообщение
 
 

Прикрепи "снимок" того, что ты получаешь применив свой запрос.

  Ответить  
 
 автор: snipe   (10.05.2009 в 07:28)   личное сообщение
 
 

:-( Убил данные
смогу только часа через три....
файл на слил уже не существует

  Ответить  
 
 автор: Goblin   (10.05.2009 в 15:33)   личное сообщение
 
 

Ангел, причем тут форма? На форме есть кнопка, нажав которую выходит нужный тебе запрос. С помощью формы лишь гибкость отработана. В твоей почте весь файл со слил в котором 2 запроса. Запрос1 - для подготовки данных и Запрос 2 - тот что тебе нужен. В него входит запрос 1. Вводишь значение в форме "2009" и получаешь все регистрационные в которые входит 2009 год и остальные, если они есть в этих регистрационных.
Там получается более 10000 штук записей. Файл в раре получается 1,5 МБт потому и отослал на почтовый.
Если форма так достала, то в запросе 1 убери условие Forms!..., и введи 2009. Тогда запрос 2 будет работать только на этот год. Но условие легче и удобнее вводить с формы, нежели лазить в запрос.

  Ответить  
 
 автор: Goblin   (11.05.2009 в 09:51)   личное сообщение
64 Кб.
 
 

Не, ангелочек. Добиваем с тобой до конца. Если нужны все регистрационные, в которые входит 2009 год, но при этом, если только один 2009, то такой регистрационный не нужен. Тогда это тоже решаемо, но уже не двумя запросами, а четырьмя. (в моем исполнении на скору руку) Запрос 4 - итоговый.
Запрос1 - Переводим длинный формат даты в простой год. Отбираем год 2009 с регистрационными.
Запрос2 - С помощью Запроса1 и таблицы выбираем из таблицы все инвентарные, в которые входит 2009 год и показываем на эти инвентарные 2009 и другие года, если они там есть. (Показываем все инвентарные со всеми их годами, в которые входит 2009 год)
Запрос3 - Группируем значения запрос2, выбираем из них только те значения регистрационных, которых больше одной записи. (Стало быть если запись только с одним 2009 годом, то ее не показываем.)
Запрос4 - С помощью запрос3 и запрос2 выводим итоговые значения. Все инвентарные, в которые входит 2009 год и другие. Те, что имеют один 2009 показаны не будут.

Ну уж если и это не то, тогда я пас.
PS: В кодах на VBA это можно было бы решить проще. Наверно.

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