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

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

Выборка из 10 и более таблиц Paradox [D7, Paradox]


Страницы:   1 2

alpine ©   (2005-12-14 02:46:00) 

Доброго времени суток. Уважаемые мастаки, помогите.

Нужно составить SQL запрос, который делает выборку из 15 таблиц. ! Нужно чтоб выводились все записи одной из таблицы (например "товар.дб")  а с остальных таблиц береётся только SUM(FIELD_SUMMA) и AVG(FIELD_PRICE). Таблицы связанны по полю КОД.

Очень нужно, не поленитесь, пожалуйста, ответить, если знаете конечно. Заранее благодарю.


evvcom   (2005-12-16 08:36:00) [21]


> и тд...  Правильно ?

Вот теперь другое дело. Правильно. Теперь вроде придраться не к чему.

> УВАЖАЕМЫ МАСТАКИ, не поленитесь ,пожалуйста, помогите. Очень
> нужно.

Ну дык. Ты ж уже написал запрос. Разве еще что-то не работает?


alpine   (2005-12-16 01:04:00) [22]

У таблицы товар есть уникальное поле КОД ТОВАРА. Этот код проходит во всех операциях (продажа, закупка и тд. их 14). У каждой операции есть естественно своя таблица. Все таблицы берут "КОД ТОВАРА" из таблицы товар. После совершения любой операции, в таблицу данной операции вводятся код товара, количество, цена, сумма, датаи ещё пару полей.

ЗАДАЧА
Мне нужно вывводить движение товара. То есть сделать SQL запрос, который берёт данные со всех таблиц. Главная таблица естественно ТОВАР, с которой берётся полей 7, а со всех операционных таблиц нужно получить общее количество ТОВАР КОДАи среднее значение ЦЕНЫ. Так же могут быть критерии отбора, например может указваться период.

УВАЖАЕМЫ МАСТАКИ, не поленитесь ,пожалуйста, помогите. Очень нужно.


alpine   (2005-12-15 15:28:00) [23]


> ЮЮ ©

Если не сложно,пожалуйста, напишите поподробнее. Получается в выборке мне не надо указывать SUM(FIELD) ? Его надо указывать после LEFT JOIN ? И GROUP надо делать для каждого отдельно, то есть надо делать так:

select * from tovar
LEFT JOIN (
  SELECT kod, SUM(KOLICHESTVO) ZakupkaSumKOLICHESTVO, AVG( (PRICE ) AVGZakupkaPRICE
  FROM Zakupka
  GROUP BY kod
) Zakupka ON (Zakupka.KOD=Tovar.Kod),
LEFT JOIN (
  SELECT kod, SUM(KOLICHESTVO) OtpuskSumKOLICHESTVO, AVG( (PRICE ) )AVGOtpuskPRICE
  FROM Otpusk
  GROUP BY kod
) Otpusk ON (Otpusk.KOD=Tovar.Kod)

и тд...  Правильно ?


Курдль   (2005-12-15 11:36:00) [24]


> alpine   (15.12.05 01:27) [7]
> Я сделал такой запрос........................................................


Не. Так дело не пойдет. Если хочешь, чтобы тебя поняли - изложи проблему в доступном виде. Проще всего - положи перед собой ER-диаграму твоей БД и зарисуй интересующий фрагмент хоть прямо здесь в псевдографике.
типа

----------                                        -----------
| TOVAR   |  >-----KOD = KOD--------+| ZAKUPKA |
----------                                        -----------


Или хотя бы опиши в терминологии РБД.


msguns   (2005-12-15 09:18:00) [25]

>alpine   (15.12.05 01:27) [7]
>Я сделал такой запрос

Засстрелиться ! (с) Соловьев


evvcom   (2005-12-15 08:50:00) [26]


> alpine   (15.12.05 01:27) [7]

Ты бы еще в двоичном коде привел бы свой запрос. Тебя форматированию кто-нибудь когда-нибудь учил? Посмотри как оформлен запрос в [8] и как у тебя. Разницу видишь? В твоем запросе только сумашедший станет разбираться.


ЮЮ   (2005-12-15 03:45:00) [27]

>НО ПРИ ПОДСЧЁТЕ SUM(ЛЮБОГО ПОЛЯ) ВЫДАЁТ НЕПРАВИЛЬНЫЙ РЕЗУЛЬТАТ

И это правильно. Если например в таблице Zakupka есть 2 записи для какого-то товара, а в Otpusk - 6, то Zakupka LEFT JOIN Otpusk  вернёт уже 6 записей. Теперь, окажись в Skprod ещё пара записей, и в Zakupka LEFT JOIN Otpusk LEFT JOIN  Skprod их станет уже 12.

Так что то, что ОНА ВЫДАЁТ В ДВА РАЗА БОЛЬШЕ - это ещё только начало :)

Объединять следует после группировки

SELECT * FROM
 Tovar
 LEFT JOIN (
   SELECT kod, SUM(KOLICHESTVO) ZakupkaSumKOLICHESTVO, AVG( (PRICE ) )AVGZakupkaPRICE
   FROM Zakupka
   GROUP BY kod
 ) Zakupka ON ON (Zakupka.KOD=Tovar.Kod)
 LEFT JOIN ...

агрегирующие подзапросы оформляются в отдельные файлы, например ZakupkaGr.sql, помещаются в БД, а запрос тогда выглядит как

SELECT * FROM
 Tovar
 LEFT JOIN "ZakupkaGr.sql" Zakupka ON (Zakupka.KOD=Tovar.Kod)
 LEFT JOIN ...


alpine   (2005-12-15 01:27:00) [28]

Я сделал такой запрос

SELECT DISTINCT Tovar.Kod, Tovar.Fullname, Tovar.Grup, Tovar.EdIzm, Tovar.Season, Tovar.Country, Tovar.ORGin, Tovar.CZrub, Tovar.CZye, Tovar.Nazenka,Tovar.Kurs, Tovar.OLDCZrub, Tovar.DataOldCZ, Tovar.Realis, Tovar.CP1rub, Tovar.CP1ye, Tovar.OLDCP1rub, Tovar.DataOldCP1, Tovar.CP2rub, Tovar.CP2ye, Tovar.Nazenka2, Tovar.CP3rub, Tovar.CP3ye, Tovar.Nazenka3, Tovar.Info, SUM( Zakupka.KOLICHESTVO ) Zakupka."Zakupka.KOLICHESTVO", AVG( Zakupka.PRICE ) Zakupka."Zakupka.PRICE", SUM( Otpusk.KOLICHESTVO ) Otpusk."Otpusk.KOLICHESTVO", AVG( Otpusk.PRICE ) Otpusk."Otpusk.PRICE", SUM( Skprod.KOLICHESTVO ) Skprod."Skprod.KOLICHESTVO", AVG( Skprod.PRICE ) Skprod."Skprod.PRICE", SUM( Shperem.KOLICHESTVO )  Shperem."Shperem.KOLICHESTVO", AVG( Shperem.PRICE ) Shperem."Shperem.PRICE", SUM( Skvosprod.KOLICHESTVO ) Skvosprod."Skvosprod.KOLICHESTVO", AVG( Skvosprod.PRICE ) Skvosprod."Skvosprod.PRICE", SUM( Skvoszak.KOLICHESTVO ) Skvoszak."Skvoszak.KOLICHESTVO", SUM( Skpereoc.KOLICHESTVO ) Skpereoc."Skpereoc.KOLICHESTVO", AVG( Skpereoc.PRICE ) Skpereoc."Skpereoc.PRICE", SUM( Skzakaz.KOLICHESTVO ) Skzakaz."Skzakaz.KOLICHESTVO", AVG( Skzakaz.PRICE ) Skzakaz."Skzakaz.PRICE", SUM( Skspis.KOLICHESTVO ) Skspis."Skspis.KOLICHESTVO", AVG( Skspis.PRICE ) Skspis."Skspis.PRICE", SUM( Shprod.KOLICHESTVO ) Shprod."Shprod.KOLICHESTVO", AVG( Shprod.PRICE ) Shprod."Shprod.PRICE", SUM( Skperem.KOLICHESTVO ) Skperem."Skperem.KOLICHESTVO", AVG( Skperem.PRICE ) Skperem."Skperem.PRICE", SUM( Shvosprod.KOLICHESTVO ) Shvosprod."Shvosprod.KOLICHESTVO", AVG( Shvosprod.PRICE ) Shvosprod."Shvosprod.PRICE", SUM( Shvosotpusk.KOLICHESTVO ) Shvosotpusk."Shvosotpusk.KOLICH", AVG( Shvosotpusk.PRICE ) Shvosotpusk."Shvosotpusk.PRICE", SUM( Shspis.KOLICHESTVO ) Shspis."Shspis.KOLICHESTVO", AVG( Shspis.PRICE ) Shspis."Shspis.PRICE" ');
       DMFrm.OPERQUERY.SQL.Add(' FROM "Tovar.DB" Tovar LEFT OUTER JOIN "Zakupka.DB" Zakupka ON (Zakupka.KOD=Tovar.Kod) LEFT OUTER JOIN "otpusk.DB" Otpusk ON (Otpusk.KOD = Tovar.Kod)  LEFT OUTER JOIN "SKPROD.DB" Skprod ON (Skprod.KOD = Tovar.Kod) LEFT OUTER JOIN "SHPEREM.DB" Shperem ON (Shperem.KOD = Tovar.Kod) LEFT OUTER JOIN "SKVOSPROD.DB" Skvosprod ON (Skvosprod.KOD = Tovar.Kod) LEFT OUTER JOIN "SKVOSZAK.DB" Skvoszak ON (Skvoszak.KOD = Tovar.Kod) LEFT OUTER JOIN "SKPEREOC.DB" Skpereoc ON  (Skpereoc.KOD = Tovar.Kod) LEFT OUTER JOIN "SKZAKAZ.DB" Skzakaz ON (Skzakaz.KOD = Tovar.Kod) LEFT OUTER JOIN "SKSPIS.DB" Skspis ON (Skspis.KOD = Tovar.Kod) LEFT OUTER JOIN "SHPROD.DB" Shprod ON (Shprod.KOD = Tovar.Kod) LEFT OUTER JOIN "SKPEREM.DB" Skperem ON (Skperem.KOD = Tovar.Kod) LEFT OUTER JOIN "SHVOSPROD.DB" Shvosprod ON (Shvosprod.KOD = Tovar.Kod) LEFT OUTER JOIN "SHVOSOTPUSK.DB" Shvosotpusk ON (Shvosotpusk.KOD = Tovar.Kod) LEFT OUTER JOIN "SHSPIS.DB" Shspis ON (Shspis.KOD = Tovar.Kod) WHERE Tovar.Deleted = FALSE GROUP BY Tovar.Kod, Tovar.Fullname, Tovar.Grup, Tovar.EdIzm, Tovar.Season, Tovar.Country, Tovar.ORGin, Tovar.CZrub, Tovar.CZye, Tovar.Nazenka, Tovar.Kurs, Tovar.OLDCZrub, Tovar.DataOldCZ, Tovar.Realis, Tovar.CP1rub, Tovar.CP1ye, Tovar.OLDCP1rub, Tovar.DataOldCP1, Tovar.CP2rub, Tovar.CP2ye, Tovar.Nazenka2, Tovar.CP3rub, Tovar.CP3ye, Tovar.Nazenka3, Tovar.Info ORDER BY Tovar.Kod'

ВСЁ РАБОТАЕТ. ОШИБОК НЕ ВЫДАЁТ. НО ПРИ ПОДСЧЁТЕ SUM(ЛЮБОГО ПОЛЯ) ВЫДАЁТ НЕПРАВИЛЬНЫЙ РЕЗУЛЬТАТ. ОНА ВЫДАЁТ В ДВА РАЗА БОЛЬШЕ. В ЧЁМ ДЕЛО ??  ПОДСКАЖИТЕ ПОЖАЛУЙСТА.


alpine   (2005-12-15 01:03:00) [29]


> Курдль ©

Вроде ошибку не выдаёт, но и не считает сумму (select sum(FIELD_SUMMA) from TABLE_1 T1 whereT1.CODE = TV.CODE) as SUMMA,), когда есть условие (whereT1.CODE = TV.CODE). Без условия считает, но это не нужно.


Курдль   (2005-12-14 10:21:00) [30]

Если парадокс умеет такое:

select T.*,
(select sum(FIELD_SUMMA) from TABLE_1 T1 whereT1.CODE = TV.CODE) as SUMMA,
(select avg(FIELD_PRICE) from TABLE_2 T2 whereT2.CODE = TV.CODE) as PRICE,
from TOVAR_BD TV


Если не умеет, то можно обдумать использование GROUP BY.


> Очень нужно, не поленитесь, пожалуйста, ответить, если знаете
> конечно.

Честно говоря, я поймал себя на мысли, что поленюсь. Т.к. для нормального запросотворчества мне нужна ER-диаграма. Или хотя бы качественное описание структуы БД в терминологии реляционного принципа типа "Есть таблица Т1, связанная "один-ко многим" с таблицей Т2 по внешнему ключу CODE..."


Sergey13   (2005-12-14 10:14:00) [31]

2[3] msguns ©   (14.12.05 10:10)
> почему-то "растащенного" по 15 таблицам (по таблице на месяц что ли ?)
А месяцев 15 что-ли?!!! 8-)


msguns   (2005-12-14 10:10:00) [32]

Если в общем случае к-во исх.таблиц переменно, то надо создать "куммулятивную" таблицу и, предварительно очистив ее (DELETE FROM AGRTABLE), собирать там данные из исх.таблиц запросами типа
INSERT INTO AGRTABLE
  SELECT <текст агрегирующего или выбирающего запроса>

В целом же, мне кажется, что вопрос поставлен просто некорректно из-за неверного понимания (или дизайна, если сам разрабатывал) модели данных в базе. Судя по всему речь идет о товарных остатках на складе, в качестве списка товаров понимается таблица, упомянутая "товар.дб", сами же остатки определяются суммированием движения, почему-то "растащенного" по 15 таблицам (по таблице на месяц что ли ?). Если так, то имеем пример дилетантской разработки модели БД, которую надо срочно выкрасить и выбросить, заменив на "классику": документ+фактура.


evvcom   (2005-12-14 08:46:00) [33]


> не поленитесь, пожалуйста, ответить, если знаете конечно

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


ЮЮ   (2005-12-14 03:21:00) [34]

И что все 14 таблиц одной структуры и теперь FIELD_SUMMA из всех таблиц надо складывать?


Страницы:   1 2

Наверх

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