[ОТВЕТИТЬ]
Опции темы
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, время: 14:41.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.