Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Формирование SQL-запроса [D6, IB6.x]


Страницы:   1 2

me2 ©   (2003-06-12 17:33:00) 

Имеются пять таблиц:
1. MATERIALS - справочник материалов с полями
material_code - уник. код
material_name - наименование
...
2. IN_MATERIALS - журнал операций прихода с полями
operation_code - уник. код операции
operation_date - дата операции
...
3 IN_MATERIAL_ITEMS - перечень материала в каждой операции с полями
operation_code - ссылка на IN_MATERIALS."operation_code"
material_code - ссылка на MATERIALS."material_code"
quantity - количество пришедшего материала
4. OUT_MATERIALS - журнал операций расхода с полями
operation_code - уник. код операции
operation_date - дата операции
...
5. OUT_MATERIAL_ITEMS - перечень материала в каждой операции с полями
operation_code - ссылка на OUT_MATERIALS."operation_code"
material_code - ссылка на MATERIALS."material_code"
quantity - количество пришедшего материала

Хочу получить выборку материалов, которые участвовали в операциях прихода/расхода с остатком на некоторое число. Делаю
так

select MATERIALS."material_name",
sum(IN_MATERIAL_ITEMS."quantity") -
sum(OUT_MATERIAL_ITEMS."quantity")
from
MATERIALS, IN_MATERIAL_ITEMS, OUT_MATERIAL_ITEMS, IN_MATERIALS, OUT_MATERIALS
where
(MATERIALS."material_code" = IN_MATERIAL_ITEMS."material_code") and
(MATERIALS."material_code" = OUT_MATERIAL_ITEMS."material_code") and
(IN_MATERIALS."operation_date" like ("12.06.2003")) and
(OUT_MATERIALS."operation_date" like ("12.06.2003")) and
(IN_MATERIAL_ITEMS."operation_code" = IN_MATERIALS."operation_code") and
(OUT_MATERIAL_ITEMS."operation_code" = OUT_MATERIALS."operation_code")

group by MATERIALS."material_name"


Выдает пустой набор данных. Данные в таблицах присутствуют. Помогите исправить ошибку.


HSolo   (2003-06-13 15:55:00) [21]

Еще раз извините
select MATERIALS."material_code", MATERIALS."material_name",
MATERIALS."character_name", MATERIALS."count_descr",
MATERIALS."parent",
sum(IN_MATERIAL_ITEMS."quantity") - sum(OUT_MATERIAL_ITEMS."quantity") summ
from
MATERIALS
left outer join IN_MATERIAL_ITEMS
on MATERIALS."material_code" = IN_MATERIAL_ITEMS."material_code"
left outer join OUT_MATERIAL_ITEMS
on MATERIALS."material_code" = OUT_MATERIAL_ITEMS."material_code"
left outer join IN_MATERIALS
on IN_MATERIAL_ITEMS."operation_code" = IN_MATERIALS."operation_code"
and (IN_MATERIALS."operation_date" = "12.06.2003")
left outer join OUT_MATERIALS
on OUT_MATERIAL_ITEMS."operation_code" = OUT_MATERIALS."operation_code"
and (OUT_MATERIALS."operation_date" = "12.06.2003")
group by MATERIALS."material_code", MATERIALS."material_name", MATERIALS."character_name",
MATERIALS."count_descr", MATERIALS."parent"

а то опять не выдаст те материалы, что не участвовали в операциях


HSolo   (2003-06-13 15:51:00) [22]

Тогда так:
select MATERIALS."material_code", MATERIALS."material_name",
MATERIALS."character_name", MATERIALS."count_descr",
MATERIALS."parent",
sum(IN_MATERIAL_ITEMS."quantity") - sum(OUT_MATERIAL_ITEMS."quantity") summ
from
MATERIALS
left outer join IN_MATERIAL_ITEMS
on MATERIALS."material_code" = IN_MATERIAL_ITEMS."material_code"
left outer join OUT_MATERIAL_ITEMS
on MATERIALS."material_code" = OUT_MATERIAL_ITEMS."material_code"
left outer join IN_MATERIALS
on IN_MATERIAL_ITEMS."operation_code" = IN_MATERIALS."operation_code"
left outer join OUT_MATERIALS
on OUT_MATERIAL_ITEMS."operation_code" = OUT_MATERIALS."operation_code"
where
(IN_MATERIALS."operation_date" = "12.06.2003") and
(OUT_MATERIALS."operation_date" = "12.06.2003")
group by MATERIALS."material_code", MATERIALS."material_name", MATERIALS."character_name",
MATERIALS."count_descr", MATERIALS."parent"


me2   (2003-06-13 15:41:00) [23]

2 HSolo © (13.06.03 15:34
>...IN_MATERIALS."material_code"... ...OUT_MATERIALS."material_code"...

В єтих таблицах нет таких полей. OUT_MATERIALS и IN_MATERIALS связаны по "operation_code" с OUT_MATERIAL_ITEMS и IN_MATERIAL_ITEMS соответственно, а вот в них уже есть "material_code"


HSolo   (2003-06-13 15:34:00) [24]

Прошу прощения, соврамши...
select MATERIALS."material_code", MATERIALS."material_name",
MATERIALS."character_name", MATERIALS."count_descr",
MATERIALS."parent",
sum(IN_MATERIAL_ITEMS."quantity") - sum(OUT_MATERIAL_ITEMS."quantity") summ
from
MATERIALS
left outer join IN_MATERIAL_ITEMS
on MATERIALS."material_code" = IN_MATERIAL_ITEMS."material_code"
left outer join OUT_MATERIAL_ITEMS
on MATERIALS."material_code" = OUT_MATERIAL_ITEMS."material_code"
left outer join IN_MATERIALS
on MATERIALS."material_code" = IN_MATERIALS."material_code"
and IN_MATERIAL_ITEMS."operation_code" = IN_MATERIALS."operation_code"
left outer join OUT_MATERIALS
on MATERIALS."material_code" = OUT_MATERIALS."material_code"
and OUT_MATERIAL_ITEMS."operation_code" = OUT_MATERIALS."operation_code"
where
(IN_MATERIALS."operation_date" = "12.06.2003") and
(OUT_MATERIALS."operation_date" = "12.06.2003")
group by MATERIALS."material_code", MATERIALS."material_name", MATERIALS."character_name",
MATERIALS."count_descr", MATERIALS."parent"


me2   (2003-06-13 15:18:00) [25]

2 HSolo © (13.06.03 14:21)
Не не работает - все равно только те материалы, которые участвовали в опрациях, да и с неправильными остатками


me2   (2003-06-13 15:17:00) [26]

2 HSolo © (13.06.03 14:21)
Не не работает - все равно только те материалы, которые участвовали в опрациях, да и с неправильнами остатками


HSolo   (2003-06-13 14:21:00) [27]

"Так" делать не надо :)
select <ваш-текст>
from
MATERIALS
left outer join IN_MATERIAL_ITEMS
on MATERIALS."material_code" = IN_MATERIAL_ITEMS."material_code"
left outer join OUT_MATERIAL_ITEMS
on MATERIALS."material_code" = OUT_MATERIAL_ITEMS."material_code"
left outer join IN_MATERIALS
on IN_MATERIAL_ITEMS."operation_code" = IN_MATERIALS."operation_code"
left outer join OUT_MATERIALS
on OUT_MATERIAL_ITEMS."operation_code" = OUT_MATERIALS."operation_code"
where
(IN_MATERIALS."operation_date" = "12.06.2003") and
(OUT_MATERIALS."operation_date" = "12.06.2003")
group by <ваш-текст>

И если у Вас Interbase - забудьте про "старый добрый *=". Это не есть стандартный синтаксис, такое поддерживает, если не ошибаюсь, Oracle, а кто еще - даже не знаю. В IB такого нет.


Sandman25   (2003-06-13 12:49:00) [28]

>Кстати, а почему не работает старый добрый способ *= вместо left outter join, неужели 3 диалект его уже полностью не поддерживает?

Извини, я спец только по Informix SQL. Там вообще в данном случае просто outer используется.


me2   (2003-06-13 12:35:00) [29]

Да так и есть, но в єтом случае выводится неправильный остаток. Т.е. где-то происходит суммирование несколько раз. Кстати, а почему не работает старый добрый способ *= вместо left outter join, неужели 3 диалект его уже полностью не поддерживает?


Sandman25   (2003-06-13 12:00:00) [30]

Я не спец в SQL с использованием LEFT JOIN и т.д., но мне кажется, что нужно написать LEFT JOIN и перед IN_MATERIALS и OUT_MATERIALS - иначе требуется наличие обязательной связи с ними.


me2   (2003-06-13 11:52:00) [31]

Народ, ну очеь нужен совет


me2   (2003-06-13 10:55:00) [32]

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


me2   (2003-06-13 10:28:00) [33]

Я делал так:

select MATERIALS."material_code", MATERIALS."material_name",
MATERIALS."character_name", MATERIALS."count_descr",
MATERIALS."parent",
sum(IN_MATERIAL_ITEMS."quantity") - sum(OUT_MATERIAL_ITEMS."quantity") summ
from
MATERIALS left outer join IN_MATERIAL_ITEMS
on MATERIALS."material_code" = IN_MATERIAL_ITEMS."material_code",
MATERIALS left outer join OUT_MATERIAL_ITEMS
on MATERIALS."material_code" = OUT_MATERIAL_ITEMS."material_code",
IN_MATERIALS, OUT_MATERIALS
where
(IN_MATERIALS."operation_date" = "12.06.2003") and
(OUT_MATERIALS."operation_date" = "12.06.2003") and
(IN_MATERIAL_ITEMS."operation_code" = IN_MATERIALS."operation_code") and
(OUT_MATERIAL_ITEMS."operation_code" = OUT_MATERIALS."operation_code")


group by MATERIALS."material_code", MATERIALS."material_name", MATERIALS."character_name",
MATERIALS."count_descr", MATERIALS."parent"

И всеравно выдает только записи участвовавшие в операциях. Да еще я по ошибке занес в реализацию больше чем было в приходе. Так минуса не получил, да и вообще ничего не получил - эта запись тоже не была учтена.


HSolo   (2003-06-13 10:16:00) [34]

select ...
from MATERIALS
left outer join IN_MATERIAL_ITEMS on MATERIALS."material_code" = IN_MATERIAL_ITEMS."material_code"
left outer join OUT_MATERIAL_ITEMS on MATERIALS."material_code" = OUT_MATERIAL_ITEMS."material_code"
...
where остальные-условия (даты итд)
Для тех материалов, что не участвовали в операциях, будет выдан null. Если нужен 0 - тогда union, или загнать все это в процедуру и в ней вместо null подставлять 0


me2   (2003-06-13 09:55:00) [35]

У меня возник еще один вопрос - как получить список всех материалов с остатками на указанное число (т.е. чтобы выводились даже те материалы (с нулевым остатком), которые не участвовали в операциях прихода / расхода )?


me2   (2003-06-12 18:26:00) [36]

2 Sandman25 © (12.06.03 18:19)
Вот это помогло. Спасибо


Sandman25   (2003-06-12 18:19:00) [37]

И еще.
В Group By придется добавить и добавленные в select поля


Sandman25   (2003-06-12 18:17:00) [38]

Попробуйте
sum(IN_MATERIAL_ITEMS."quantity") - sum(OUT_MATERIAL_ITEMS."quantity")
заменить на
sum(IN_MATERIAL_ITEMS."quantity" - OUT_MATERIAL_ITEMS."quantity")


me2   (2003-06-12 17:58:00) [39]

Да действительно в дате была проблема - исправил. Теперь попытался вывести еще дополниттельные поля, т.е.

select MATERIALS."material_code", MATERIALS."material_name",
MATERIALS."character_name", MATERIALS."count_descr",
MATERIALS."parent",
MATERIALS."material_name",
sum(IN_MATERIAL_ITEMS."quantity") - sum(OUT_MATERIAL_ITEMS."quantity")
from
MATERIALS, IN_MATERIAL_ITEMS, OUT_MATERIAL_ITEMS , IN_MATERIALS, OUT_MATERIALS
where
(MATERIALS."material_code" = IN_MATERIAL_ITEMS."material_code") and
(MATERIALS."material_code" = OUT_MATERIAL_ITEMS."material_code") and
(IN_MATERIALS."operation_date" = "12.06.2003") and
(OUT_MATERIALS."operation_date" = "12.06.2003") and
(IN_MATERIAL_ITEMS."operation_code" = IN_MATERIALS."operation_code") and
(OUT_MATERIAL_ITEMS."operation_code" = OUT_MATERIALS."operation_code")

group by MATERIALS."material_name"


Говорит:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
invalid column reference.


Sandman25   (2003-06-12 17:48:00) [40]

Мне подозрительна конструкция
operation_date" like ("12.06.2003")
Вы дату в виде Char(10) храните? Причем именно в таком виде, с разделителями "."? Зачем там like, можно просто =


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо