Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.23;
Скачать: CL | DM;

Вниз

Помогите разобраться с запросом   Найти похожие ветки 

 
V-A-V ©   (2005-09-29 11:03) [0]

Есть две таблицы:
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

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


 
msguns ©   (2005-09-29 11:19) [1]

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)


 
msguns ©   (2005-09-29 11:21) [2]

Пардон

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)


 
ANB ©   (2005-09-29 11:50) [3]


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

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


 
V-A-V ©   (2005-09-29 12:04) [4]

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

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

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

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


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

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

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


 
sniknik ©   (2005-09-29 12:24) [6]

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


 
ANB ©   (2005-09-29 12:28) [7]


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


 
sniknik ©   (2005-09-29 12:31) [8]

а ну да, сорру

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


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


 
V-A-V ©   (2005-09-29 12:45) [9]

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

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

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

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


 
sniknik ©   (2005-09-29 13:19) [10]

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

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


 
sniknik ©   (2005-09-29 13:20) [11]

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


 
V-A-V ©   (2005-09-29 13:33) [12]

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

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

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


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

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


 
Sergey13 ©   (2005-09-29 13:41) [14]

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


 
V-A-V ©   (2005-09-29 14:06) [15]

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

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


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

> в данный момент у меня
> 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



Страницы: 1 вся ветка

Текущий архив: 2005.10.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
14-1128247418
злобная танька
2005-10-02 14:03
2005.10.23
десятичная система


14-1128235140
Мазут Береговой
2005-10-02 10:39
2005.10.23
Старый добрый "Крокодил"


5-1104347961
denisww
2004-12-29 22:19
2005.10.23
наследование класса


4-1124694289
Fanny
2005-08-22 11:04
2005.10.23
Как обойтись без StrLCat ?


14-1128342412
oldman
2005-10-03 16:26
2005.10.23
У директора сломался факс :(