Консультация № 121818
05.02.2008, 19:16
0.00 руб.
0 7 4
Здравствуйте ув. эксперты!
Есть такой вопрос, думаю не легкий. Есть таблица Товары (содержит информацию о товаре), а также три таблицы Магазин1, Магазин2, Магазин3. В них есть такие поля: ИдТовара, Наличие,Приход,Продажи.
Мне надо составить запрос так, чтобы в результате запроса были такие колонки: ну собственно сама информация о товара, а также Магазин1, Магазин2, Магазин3. В последних трех колонках должно стоять количество товара в данном магазине, а если такого нету, то нуль. Это количество берется из поля Наличие в каждой таблице Магазин.
Не знаю, может я как-то неправильно составил таблицы и связь между ними, но я уже долго мучаюсь, а такого запроса составить не могу. Возвращает тока те товары, которые есть во всех трех магазинах. Но мне надо получить именно такой результат.
ЗЫ: В таблицах Магазин хранится инфа тока о том товаре, который там есть, т.е. нулей нету.
ЗЫ:ЗЫ: делаю в MS Access

Обсуждение

Неизвестный
05.02.2008, 22:25
общий
это ответ
Здравствуйте, BerdArt!
Таблицы, на мой взгляд, дествительно составлены не правильно. Вместо 3-х таблиц магазинов надо было сформировать таблицу "Магазины" со столбцами ID, MAGAZ_NAME, а также одну таблицу типа "Склад" с полями ИдМагазина,ИдТовара, Наличие,Приход,Продажи. Ну и связать их по Ид. Это позволит не привязываться только к трем магазинам.

Но и в Вашем случае можно составить запрос примерно такого вида:
select т.Ид, [т.остальные поля,]
(select м1.Наличие from Магазин1 м1 where м1.ИдТовара=т.Ид) mag1,
(select м2.Наличие from Магазин2 м1 where м2.ИдТовара=т.Ид) mag2,
(select м3.Наличие from Магазин3 м3 where м3.ИдТовара=т.Ид) mag3
from Товары т

Удачи!
Неизвестный
06.02.2008, 02:40
общий
это ответ
Здравствуйте, BerdArt!
Создайте групповой запрос с параметрами объединения:
Всех записей из таблицы товары с таблицей Магазин1, в которых связанные поля совпадают.
FROM Товары LEFT JOIN Магазин1 ON Товары.Id_Товары = Магазин1.Id_Товары

"Три последних" могут формироваться так:
Sum(IIf(IsNull([Магазин?]![количество]),0,[Магазин?]![количество]))

Евгений.
Неизвестный
06.02.2008, 08:54
общий
это ответ
Здравствуйте, BerdArt!
Используйте в запросе объеденение один ко многим.
Т.е. одна запись в табл товары и много записей в табл. магазин.
Неизвестный
06.02.2008, 09:12
общий
это ответ
Здравствуйте, BerdArt!
Видимо вам необходимо сделать объединение трех запросов. Точно не помню, но в оракле есть такая штука как union

select field1, field2, field3
from table1
where ...
union all
select field1, field2, field3
from table2
where ...
union all
select field1, field2, field3
from table3
where ...

А похорошему таблица магазинов должна быть одна. Должно быть поле определяющее id магазина

table good
gid
name
price_buy
price_sale
... etc

table shops
sid
name
address

table container
cid
gid
sid
count
sold
shipping
income

Что-то в этом духе. Не стоит хранить в принципе одни и те же данные в разных таблицах.
Неизвестный
06.02.2008, 13:53
общий
Тесленко Евгений Алексеевич!>>Sum(IIf(IsNull([Магазин?]![количество]),0,[Магазин?]![количество])) Когда я пробовал составить запрос непосредственно на SQL, использую такие функции, то получал ответ, что типа неизвестные функции.А это очень похоже на код VBA, но его SQL-интрепретатор, если его можно так назвать, принимает это. Так что получается, что в SQL-запросе можно использовать VBA????
Неизвестный
10.02.2008, 19:26
общий
Здравствуйте BerdArt.Разный "диалект" SQL у разных баз данных, строка создана в MS Access.Для использования в запросах к другим БД может потребоваться изменения синтаксиса.Функции IIf и Sum используются в SQL но конструкция зависит от диалекта.Евгений.
Неизвестный
11.02.2008, 09:13
общий
Запрос должен быть примерно следующийselect id_tovar,name,m1.Наличие, m2.наличие, m3.Наличиеfrom Tovarleft join m1 on tovat.id_tovar = m1.id_tovarleft join m2 on tovat.id_tovar = m2.id_tovarleft join m3 on tovat.id_tovar = m3.id_tovarЭтот запрос выводит ВСЕ остатки по товарам в магазинах.будет выведен весь список товаров.если остатков в магазине нет, в соответствующем столюце будет NULLможно доработать запрос, чтобы выводил в этом случае 0 (вставить функцию isnull) но это надо посмотреть уже в самом ACCESS, реализация этой функции в ACCESS и SQL различается.С уважением, Игорь
Форма ответа