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

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

Помогите разобраться с запросом [D6, MsAccess]


V-A-V ©   (2005-09-29 11:03:00) 

Есть две таблицы:
1.
Tovar – список товаров
 Id  –  ключ
 Name – наименование
2. jrOper – журнал операций по товарам
 Id – ключ
 Tovar_Id – связка с Id Tovar
 isPrihod – Boolean (приход или расход)
 Kol – количество товара

Задача:
Нужно одним запросом выбрать сколько всего каждого товара пришло и израсходовано.

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

jrPrih:
SELECT j.* FROM jrOper AS j WHERE j.isPrihod;jrRash:
SELECT j.* FROM jrOper AS j WHERE not j.isPrihod;

Затем попытался сделать выборку одним запросом
Текст моего запроса:

SELECT t.Name, Sum(jp.Kol) as KolPrih, Sum(jr.Kol) as KolRash
FROM (Tovar as t Inner Join ijPrih as jp On t.Id = jp.Tovar_Id)
           Inner JOIN jrRash as jr On t.Id = jr.Tovar_Id
GROUP BY t.Name

Этот запрос выдает неверное количество прихода и расхода. Если запрашивать по отдельность двумя запросами, то количества выдаются верно.  

SELECT t.Name, Sum(jp.Kol) as KolPrih
FROM Tovar as t Inner Join ijPrih as jp On t.Id = jp.Tovar_Id
GROUP BY t.Name

и
SELECT t.Name, Sum(jr.Kol) as KolRash
FROM Tovar as t  Inner JOIN jrRash as jr On t.Id = jr.Tovar_Id
GROUP BY t.Name

Где я не прав и как исправить ошибку


sniknik   (2005-09-29 16:20:00) [1]

> в данный момент у меня
> Provider=Microsoft.Jet.OLEDB.4.0
Jet iif поддерживает. (хотя может в "Дельфине" какойто другой Jet? Переходи на Delphi там тот что надо ;о))

> просто разговор зашел уже об iif - е
это не разговор, а жалоба. разговор это когда аргументированно с указанием, как и что (как делаеш и что происходит/ошибки, описание...)

по запросу. вот так наверно быстрее всего получится... (сравнить надо на больших обьемах. и точнее (даже если товар "потеряется"(запись), а инфа о расходах не "уплывет" (правда не пойми что в расходе приходе будет... ;)))
SELECT t.Id, t.Name, s.KolPrih, s.KolRash FROM
 (SELECT Tovar_Id, Sum(iif(isPrihod, Kol, 0)) as KolPrih, Sum(iif(isPrihod, 0, Kol)) as KolRash
 FROM jrOper
 GROUP BY Tovar_Id) AS s
LEFT JOIN Tovar AS t ON s.Tovar_Id = t.Id


V-A-V   (2005-09-29 14:06:00) [2]

> Убей, не пойму, чем не нравится [2].

да все нравится, спасибо уже все наладил и все шкворчит как надо.
просто разговор зашел уже об iif- е


Sergey13   (2005-09-29 13:41:00) [3]

2[13] msguns ©   (29.09.05 13:37)
>Убей, не пойму, чем не нравится [2].
Group By -ев не хватает. Не работает. 8-)


msguns   (2005-09-29 13:37:00) [4]

Убей, не пойму, чем не нравится [2]. Тем более, что по этой "рыбе" можно состряпать запрос, считающий оборотно-сальдовую, т.е. остатки на начало+приход+расход+остатки на конец за любой период.


V-A-V   (2005-09-29 13:33:00) [5]

> смени провайдера.

а где его взять

в данный момент у меня
Provider=Microsoft.Jet.OLEDB.4.0


sniknik   (2005-09-29 13:20:00) [6]

в смысле OLEDB провайдера, а не интернета ;)


sniknik   (2005-09-29 13:19:00) [7]

> iif в самом Access  проходит, а вот в Дельфине в AdoQury нет, почемуто ????
высказать предположение? о максмально возможной кривизне рук для его использования? ;о))

смени провайдера.


V-A-V   (2005-09-29 12:45:00) [8]

> msguns ©   (29.09.05 12:14) [5]
> Запрос-то выполни, а ? А процедуры в топку ;)

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

> sniknik ©   (29.09.05 12:31) [8]

iif в самом Access  проходит, а вот в Дельфине в AdoQury нет, почемуто ????


sniknik   (2005-09-29 12:31:00) [9]

а ну да, сорру

SELECT t.Name, Sum(iif(o.isPrihod, Kol, 0)) as KolPrih, Sum(iif(o.isPrihod, 0, Kol)) as KolRash
FROM jrOper AS o INNER JOIN Tovar as t ON o.Tovar_Id = o.Id
GROUP BY t.Name


правильнее, если опять не запутался ;)


ANB   (2005-09-29 12:28:00) [10]


> а на самом деле надо около десятка сумм тащить из этого
> журнала по каждому товар
- откуда десяток то ?


sniknik   (2005-09-29 12:24:00) [11]

SELECT Name, Sum(iif(isPrihod, Kol, 0)) as KolPrih, Sum(iif(isPrihod, 0, Kol)) as KolRash
FROM jrOper
GROUP BY Name


msguns   (2005-09-29 12:14:00) [12]

>V-A-V ©   (29.09.05 12:04) [4]

Запрос-то выполни, а ? А процедуры в топку ;)


V-A-V   (2005-09-29 12:04:00) [13]

> msguns ©   (29.09.05 11:21) [2]

union меня не устраивает, все надо в одну строку

> ANB ©   (29.09.05 11:50) [3]

Не хотелось бы использовать вложенные запросы, тогда запрос получается грамоздким и плохочитаемым, да и в примере я привел только получение сумм двух полей количества, а на самом деле надо около десятка сумм тащить из этого журнала по каждому товару
Поэтотому, то я и сделал две хранимых процедуры.


ANB   (2005-09-29 11:50:00) [14]


> V-A-V ©   (29.09.05 11:03)
- хранимка тут не нужна.
А по сабжу -
> msguns ©   (29.09.05 11:21) [2]

уже все написал. Если только в одну строку надо (
Товар, остаток на начало, приход, расход, остаток на конец
), тогда по другому чуть придется. Но тогда без вложенных запросов не обойтись. А акссес их поддерживает ?


msguns   (2005-09-29 11:21:00) [15]

Пардон

SELECT id, SUM(KolP) AS Prihod, SUM(KolR) AS Rashod FROM
(SELECT id, 0 AS KolP, SUM(Kol) AS KolR FROM jrOPER
 WHERE isPrihod=false
UNION
SELECT id, SUM(Kol) AS KolP, 0 AS KolR FROM jrOPER
 WHERE isPrihod=true)


msguns   (2005-09-29 11:19:00) [16]

SELECT id, SUM(KolP) AS Prihod, SUM(KolR) AS Rashod FROM
(SELECT id, 0 AS KolP, SUM(Kol) AS KolR FROM jrOPER
  WHERE isPrihod=false
 SELECT id, SUM(Kol) AS KolP, 0 AS KolR FROM jrOPER
  WHERE isPrihod=true)


Наверх

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