![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Формирование SQL-запроса [D6, IB6.x]
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, можно просто =