Форум: "Начинающим";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с запросом Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.041 c