Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с SQL -запросом, SQL-запрос 
:(
    Опции темы
FireAlex
Дата 19.4.2005, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 17.11.2004

Репутация: нет
Всего: нет



база на MSAccess, ado
такие таблицы.
tblDATE
--------------------------
DateId : счетчик
fldate : DateTime


tblOstatok
----------------------
IdOperator : integer
DateId : integer
Ostatok : integer

tblOperator
-------------------------
IdOperator : счетчик
FIO : string

в таблице tblOstatok по датам и операторам хранится остаток товара (в штуках).
нужно написать такой запрос чтобы выдал список операторов и остаток товара на заданную дату ближайшую слева или равную ей. дата задается как параметр.
то есть допустим задаю дату 12.12.2004 - находится запись в таблице tblOstatok с датой, меньшей или равной 12.12.2004
и выводится FIO оператора, дата, и остаток на эту дату и так далее по всем операторам...
проблема как определить такую дату?
PM MAIL   Вверх
DDX
Дата 19.4.2005, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 31.1.2005
Где: Москва

Репутация: 5
Всего: 5



FireAlex
Если честно, не понял твой вопрос. тебе нужно помочь составить запрос, или сделать дату пареметром, или проблема в том, чтобы найти равную или первую по меньшинству?

если дата нужна как параметр, то в тексте запрос пишешь что-то типа

"... tblDATE.flDate<= [Дата:].."

если нужна первая совпадающая, или меньше, что-то типа того:

Код

select FIRST (tblDATE.flDate) ... FROM ... 
GROUP BY <выражение высичления остатка, оператор> ... 
HAVING (((First(tblDATE.flDate))<=[Дата:]))
ORDER BY First(tblDATE.flDate) DESC;


Это сообщение отредактировал(а) DDX - 19.4.2005, 08:34
--------------------
Учиться, учитьcя и ещё раз учиться  
PM MAIL WWW   Вверх
DimW
Дата 19.4.2005, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Код

SELECT 
 tOP.FIO
,tD.flDATE
,tOST.OSTATOK
FROM 
 tblDATE         tD
,tblOSTATOK   tOST
,tblOPERATOR tOP
WHERE tD.flDATE<=:pDATE
     AND tOST.DateId = tD.DateId
     AND tOP.IdOperator=tOST.IdOperator 


Если я тебя правильно понял, то запрос будет возвращать оператора который формировал остаток на дату>=указанную дату.
Добавлено @ 09:13
Цитата
если дата нужна как параметр, то в тексте запрос пишешь что-то типа

"... tblDATE.flDate<= [Дата:].."


DDX можешь пояснить что это - [Дата:]?
что то я не встречал такова синтаксиса в SQL...
обычно параметр указывается как - :Дата
smile
PM MAIL ICQ   Вверх
DDX
Дата 19.4.2005, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 31.1.2005
Где: Москва

Репутация: 5
Всего: 5



DimW
этоя применительно к Access, на автопилоте)
ты конечно прав

только ты ещё, кажется, пропустил AS при задании таблиц:
tblDATE tD
,tblOSTATOK tOST
,tblOPERATOR tOP
smile)))))

Это сообщение отредактировал(а) DDX - 19.4.2005, 09:35
--------------------
Учиться, учитьcя и ещё раз учиться  
PM MAIL WWW   Вверх
DimW
Дата 19.4.2005, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата
только ты ещё, кажется, пропустил AS при задании таблиц:
tblDATE tD
,tblOSTATOK tOST
,tblOPERATOR tOP
)))))


а ты праверь!!! smile smile
PM MAIL ICQ   Вверх
DDX
Дата 19.4.2005, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 31.1.2005
Где: Москва

Репутация: 5
Всего: 5



и правда!) smile
век живи - век учись)
DimW, извини..

Это сообщение отредактировал(а) DDX - 19.4.2005, 10:04
--------------------
Учиться, учитьcя и ещё раз учиться  
PM MAIL WWW   Вверх
DimW
Дата 19.4.2005, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата
DimW, извини..


ды ладно че ты... smile
PM MAIL ICQ   Вверх
FireAlex
Дата 22.4.2005, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 17.11.2004

Репутация: нет
Всего: нет



наконец то руки дошли...smile
ваши запросы немного не работают в том плане что выводится список всех операторов у которых остаток <=:pDate
и ещё нельзя использовать псевдоним tOp - это я к DimW:)...
я наваял в итоге такой запрос но он выводит повторяющиеся записи: скажем

оператор1 12.12.2004 100
оператор1 13.12.2004 200

pDate = 14.12.2004. нужно чтобы первую строку не выводил.

подскажите что не так в этом запросе:

Код

SELECT FIRST (tD.fldDateTime), 
            tOst.fldOstatok, 
            tOper.fldFIO
FROM tblDATE         tD,
          tblOstatok    tOSt, 
          tblOperators tOper
WHERE  
          tOst.fldDateId  = tD.fldDateId
  AND  tOper.IdOperator = tRest.fldIdOperator
GROUP BY 
   tOper.fldFIO,
   tOst.fldRestSim, 
   tOper.fldFIO
HAVING ((FIRST (tD.fldDateTime))<=:pDate)
ORDER BY First(tD.fldDateTime) DESC;





PM MAIL   Вверх
DimW
Дата 22.4.2005, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата
и ещё нельзя использовать псевдоним tOp - это я к DimW:)...


Аргументы пожалуйста...

Цитата
я наваял в итоге такой запрос но он выводит повторяющиеся записи: скажем

оператор1 12.12.2004 100
оператор1 13.12.2004 200


это можно решить так:

Код

SELECT 
 tOP.FIO
,MAX(tD.flDATE)
,tOST.OSTATOK
FROM 
 tblDATE         tD
,tblOSTATOK   tOST
,tblOPERATOR tOP
WHERE tD.flDATE <= :pDATE
     AND tOST.DateId = tD.DateId
     AND tOP.IdOperator = tOST.IdOperator
GROUP BY tOP.FIO,tOST.OSTATOK



PM MAIL ICQ   Вверх
FireAlex
Дата 22.4.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 17.11.2004

Репутация: нет
Всего: нет



по первой части:
Цитата

и ещё нельзя использовать псевдоним tOp - это я к DimW:)...
Аргументы пожалуйста...


а ты попробуй.
TOP -эта такая инструкция SQL и когда пытаюсь выполнить твой запрос то получаем месагу -
SYNTAX ERROR in FROM CLAUSE.

кстати твой новый запрос
Код

SELECT 
 tOP.FIO
,MAX(tD.flDATE)
,tOST.OSTATOK
FROM 
 tblDATE         tD
,tblOSTATOK   tOST
,tblOPERATOR tOP
WHERE tD.flDATE <= :pDATE
     AND tOST.DateId = tD.DateId
     AND tOP.IdOperator = tOST.IdOperator
GROUP BY tOP.FIO,tOST.OSTATOK

тоже дублирует операторов...
PM MAIL   Вверх
DimW
Дата 22.4.2005, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Цитата
TOP -эта такая инструкция SQL и когда пытаюсь выполнить твой запрос то получаем месагу -
SYNTAX ERROR in FROM CLAUSE.


сори... smile

Цитата
тоже дублирует операторов...

мда, не досмотрел...

запрос нехочит решаться стандартным SQL... smile
PM MAIL ICQ   Вверх
Dimich
Дата 22.4.2005, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Код
select fio, maxd.fldate, ostatok
from tblOstatok, tblOperator,
(
select tbloperator.idoperator, tbldate.dateid, max (fldate) fldate
from tbldate, tbloperator, tblostatok
where tbldate.dateid = tblostatok.dateid
  and tblostatok.idoperator = tbloperator.idoperator
  and tbldate.fldate <= :p_date
group by tbloperator.idoperator, tbldate.dateid
) maxd
where tblOstatok.idoperator = tbloperator.idoperator
  and tblOstatok.idoperator = maxd.idoperator
  and tblOstatok.dateid = maxd.dateid

З.Ы. В Оракле будет работать, если ошибок синтаксических не наделал, а в аксесе должно....

Это сообщение отредактировал(а) Dimich - 22.4.2005, 13:44
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Dimich
Дата 22.4.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Не спешите пробовать - не правильно работает вложенный селект, зараза
--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
Dimich
Дата 22.4.2005, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 247
Регистрация: 25.8.2004
Где: Брянск

Репутация: 3
Всего: 7



Вот рабочий вариант, только оговорка - таблица tbldate должна иметь уникальность по полю fldate
Код
select tbloperator.fio, tblostatok.ostatok, tbldate.fldate
from tbloperator, tblostatok, tbldate
where tbloperator.idoperator = tblostatok.idoperator
  and tbldate.dateid = tblostatok.dateid
  and (tblostatok.idoperator, tbldate.fldate) in
(
select tblostatok.idoperator, max (tbldate.fldate) fldate
from tbldate, tblostatok
where tbldate.dateid = tblostatok.dateid
  and tbldate.fldate <= :p_date
group by tblostatok.idoperator
)

--------------------
Не работает - исправь, работает - не трогай!!!
PM MAIL ICQ Jabber   Вверх
DimW
Дата 26.4.2005, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 5
Всего: 44



Dimich, как я и предпологал такая конструкция в аксэсе не прокатила (говорит, что из подчененного запроса невозможно возвратить более одного поля ), а в оракле наура!!! По моему (касательно аксэса) праблема такова селекта не решаема...

Темнемение, такую структуру я встретил первый раз, даже вчера ее уже исмользовал (удобно блин!!!!). Dimich держи законный + smile

FireAlex - если умудришься, не забывай об остальных!!! smile
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.