Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Остатки товаров на определенную дату : Супермаг Плюс (Супермаг 2000)

20.04.2024 6:40


19.03.2007 08:49
dmware
 
Даже и не предполагал, что так можно)
Только после выполнения возвращается вообще непонятно откуда взявшееся значение. Попробую разобраться в чем дело.
Спасибо тебе, Mtirt, большое!
19.03.2007 08:59
dmware
 
Такой запрос:
Код:
SELECT SUM(QUANT) FROM 
       (SELECT MAX(FFMapRep.INCOMEQ) - MAX(FFMapRep.SALEQ) QUANT 
        FROM FFMapRep 
        WHERE FFMapRep.article = '0003672' 
        AND SALEDATE <= to_date('01.03.2007', 'DD.MM.YYYY')
        AND nvl(SALELOCATIONFROM, SALELOCATIONTO) IN(6))
берет максимальное значение прихода (вообще в таблице; здесь у меня 20) и отнимает максимальное значение расхода (15). получается конечно совсем не то. А как прогнать таким образом, чтобы вычислялась сумма всех значений, а подзапрос, в выражении MAX(FFMapRep.INCOMEQ) - MAX(FFMapRep.SALEQ) вычислял бы данные конкретной строки, а не собирал бы соответственно max значения в таблице?
OlegON: По возможности, выделяй код (кнопка Code наверху). Читать невозможно.
19.03.2007 09:40
OlegON
 
Код:
SELECT SUM(QUANT),
(SELECT MAX(FFMapRep.INCOMEQ) - MAX(FFMapRep.SALEQ) QUANT
FROM FFMapRep
WHERE FFMapRep.article = '0003672'
AND SALEDATE <= to_date('01.03.2007', 'DD.MM.YYYY')
AND nvl(SALELOCATIONFROM, SALELOCATIONTO) IN(6))
FROM FFMAPREP
Не вникал в логику, просто запрос поправил по твоим словам. Так?
Да, ошибся, там псевдоним QUANT выбирается, но тем не менее суть такая. Думай немного сам.
19.03.2007 09:41
Mtirt
 
Убрать группировку и функцию Max.
Поставить условие, выбирающее эту конкретную строку...
19.03.2007 09:45
dmware
 
Запрос
Код:
SELECT SUM(INCOMEQUANT) FROM( 
 SELECT 
     INCOMEID,     
     MAX(INCOMEQ) INCOMEQUANT     
     FROM ffmaprep
     WHERE           
         ARTICLE='0003672'
         AND SALEDATE <= to_date('01.03.2007', 'DD.MM.YYYY')
         AND nvl(SALELOCATIONFROM, SALELOCATIONTO) IN(6)         
     GROUP BY INCOMEID
     )
возвратит количество пришедших в магазин товаров с данным артикулом, а
запрос
Код:
SELECT SUM(SALEQUANT) FROM( 
 SELECT 
     SALEID,     
     MAX(SALEQ) SALEQUANT     
     FROM ffmaprep
     WHERE           
         ARTICLE='0003672'
         AND SALEDATE <= to_date('01.03.2007', 'DD.MM.YYYY')
         AND nvl(SALELOCATIONFROM, SALELOCATIONTO) IN(6)         
     GROUP BY SALEID
     )
возвратит количество проданных товаров с данным артикулом.
Оба они возвращают числовое значение. Можно ли каким-нибудь внешним запросом вычислить теперь их разность?
Например, что-то вроде такого:
SELECT sum(QUANT)(первый запрос - второй запрос)
19.03.2007 09:49
OlegON
 
как ни странно, если втупую, то
Код:
select (первый запрос)-(второй запрос) from dual
если sum(quant) выбираешь откуда-то, то
Код:
select sum(quant),(первый запрос)-(второй запрос) from откуда берешь quant
19.03.2007 09:53
dmware
 
Цитата:
Mtirt Убрать группировку и функцию Max.
Поставить условие, выбирающее эту конкретную строку...
Если убрать функцию max из подзапроса, в расчете будут учитываться строки у которых saleid совпадает, а incomeid - разное.
19.03.2007 09:53
Mtirt
 
Давай мы не будем друг друга мучить.
Код:
SELECT StoreLoc, 
       Article, 
       IncomeId, 
       IncomeType, 
       IncomeSpecItem, 
       max(GoodsOwner) GoodsOwner, 
       max(IncomeClientIndex) ClientIndex, 
       max(IncomeVatRate) VatRate, 
       max(IncomeQ) DocQuantity, 
       max(IncomeSum) DocSum, 
       max(IncomeNoVat) DocSumNoVat, 
       ForcedMapping, 
       sum(Quantity) Quantity
FROM ( 
SELECT /*+ ORDERED USE_NL(S,A) FULL(A) FULL(M.U_MapRep.FFMapRep) */ 
       SaleLocationTo StoreLoc, 
       Article, 
       IncomeId, 
       IncomeType, 
       IncomeSpecItem, 
       GoodsOwner, 
       IncomeClientIndex, 
       IncomeVatRate, 
       IncomeQ, 
       IncomeSum, 
       IncomeNoVat, 
       ForcedMapping, 
       Quantity
FROM FVMapRep
WHERE SaleDate between :date_start and :date_end
      and forcedMapping=0
      and SaleLocationTo is not NULL  
UNION ALL SELECT /*+ ORDERED USE_NL(S,A) FULL(A) FULL(M.U_MapRep.FFMapRep) */ 
      SaleLocationFrom StoreLoc, 
      Article, 
      IncomeId, 
      IncomeType, 
      IncomeSpecItem, 
      GoodsOwner, 
      IncomeClientIndex, 
      IncomeVatRate, 
      IncomeQ, 
      IncomeSum, 
      IncomeNoVat, 
      ForcedMapping, 
      -Quantity
FROM FVMapRep
WHERE SaleDate between :date_start and :date_end
      and forcedMapping=0
      and SaleLocationFrom is not NULL )
GROUP BY StoreLoc, 
         Article, 
         IncomeId, 
         IncomeType, 
         IncomeSpecItem, 
         ForcedMapping 
HAVING ROUND(sum(Quantity),3) <> 0
Это запрос по расчету остатков, как он есть в См2000.
Учти, что Date_start - это дата начала товародвижения в базе.
19.03.2007 09:56
dmware
 
Цитата:
olegon
Код:
SELECT SUM(QUANT),
(SELECT MAX(FFMapRep.INCOMEQ) - MAX(FFMapRep.SALEQ) QUANT
FROM FFMapRep
WHERE FFMapRep.article = '0003672'
AND SALEDATE <= to_date('01.03.2007', 'DD.MM.YYYY')
AND nvl(SALELOCATIONFROM, SALELOCATIONTO) IN(6))
FROM FFMAPREP
Не вникал в логику, просто запрос поправил по твоим словам. Так?
Да, ошибся, там псевдоним QUANT выбирается, но тем не менее суть такая. Думай немного сам.
В SUM(QUANT) выдается ошибка - неизвестное имя столбца. Поскольку QUANT выбирается из позапроса...
Прежде чем писать в форум, стараюсь сначала разобраться сам. Только вот опыта работы с SQL у меня маловато(
19.03.2007 10:01
dmware
 
спасибо еще раз за ответы. буду разбираться
Часовой пояс GMT +3, время: 06:40.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.