Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
14-1128082751
Digitman
2005-09-30 16:19
2005.10.23
OleConvertIStorageToOLEStream


14-1128247418
злобная танька
2005-10-02 14:03
2005.10.23
десятичная система


14-1128424599
Андрей Жук
2005-10-04 15:16
2005.10.23
Покритикуйте


4-1124400688
Сергей_2
2005-08-19 01:31
2005.10.23
Как перехватить и заменить сканкод клавиши


3-1126603451
malamba
2005-09-13 13:24
2005.10.23
присоединение к dbf





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский