[ОТВЕТИТЬ]
Опции темы
26.12.2007 07:46  
isi
собственно сабж, я использую ROWNUM и потом получаю первую запись, но что то для больших объемов тяжеловато, поделитесь решениями может у кого что оригинальное есть
 
26.12.2007 08:51  
Mtirt
Вот здесь https://olegon.ru/showthread.php?t=2628&page=4&highlight=%F6%E5%ED%E0+%ED%E0+%E4%E0%F2%F3 YuraZ в составе запроса выкладывал достаточно интересный поиск цены.

Попробуй.
 
26.12.2007 09:13  
isi
Меня интересует имеено цена прихода, а не розницы
 
26.12.2007 11:41  
isi
Пока сделал функцию, вроде достаточно быстро работает, давайте свои варианты:

FUNCTION LAST_PRIHOD (
v_art IN VARCHAR2,
v_storeloc IN PLS_INTEGER,
v_date IN DATE
)
RETURN NUMBER
IS
CURSOR mycursor
IS
SELECT /*+ FIRST_ROWS */ smdocuments.createdat, itemprice
FROM smdocuments, smspec
WHERE smdocuments.doctype = smspec.doctype
AND smdocuments.ID = smspec.docid
AND smdocuments.docstate IN (2, 3)
AND smdocuments.doctype IN ('WI', 'PO')
AND smdocuments.userop IS NULL
AND smdocuments.opcode = 0
AND smdocuments.createdat <=
TO_DATE (TO_CHAR (v_date, 'DDMMYYYY'), 'DDMMYYYY')
AND smdocuments.locationto = v_storeloc
AND smspec.article = v_art
ORDER BY smdocuments.createdat DESC;

mycursor_rec mycursor%ROWTYPE;
v_itemprice NUMBER;
BEGIN
OPEN mycursor;

FETCH mycursor
INTO mycursor_rec;

IF NOT mycursor%NOTFOUND
THEN
v_itemprice := mycursor_rec.itemprice;
ELSE
v_itemprice := 0;
END IF;

CLOSE mycursor;

RETURN v_itemprice;
END;
 
27.12.2007 14:27  
Mihon
Я бы так сделал : max по дате, но дата меньше systime.
 
28.12.2007 03:28  
isi
Цитата:
Сообщение от Mihon
Я бы так сделал : max по дате, но дата меньше systime.
Я что то не так понял, как это "max по дате" в условии возможно?

Да кстати попробую порыть в аналитических функциях, там тоже много чего интересного.
 
28.12.2007 08:40  
Mihon
Цитата:
Сообщение от isi
Я что то не так понял, как это "max по дате" в условии возможно?
Либо 1-м запросом выбирать макс. дату в переменную, потом юзать,
либо вложенным запросом
 
28.12.2007 09:57  
Mtirt
У меня вот такой вариант завалялся, похоже это вообще из SpotLight-а выдернули. Я такого точно не писала.
Код:
SELECT /*+ ORDERED USE_NL(S T) FULL(G) INDEX(S) INDEX(T)  */
 G.LOCID AS locid ,
 G.ARTICLE AS article ,
 SUM(S.QUANTITY) AS qty ,
 ROUND(SUM(S.TOTALPRICE) /
       DECODE(SUM(S.QUANTITY), 0, NULL, SUM(S.QUANTITY)),
       1) AS price1 ,
 ROUND((SUM(S.TOTALPRICE) - SUM(NVL(T.TAXSUM, 0))) /
       DECODE(SUM(S.QUANTITY), 0, NULL, SUM(S.QUANTITY)),
       1) AS price2 
  FROM 
  (SELECT T.ID AS locid ,
       T.ARTICLE AS article ,
       SUBSTR(T.MAX_DATA, 9) AS id ,
       TO_DATE(SUBSTR(T.MAX_DATA, 1, 8), 'YYYYMMDD') AS createdat 
  FROM (SELECT D.LOCATIONTO ID,
               S.ARTICLE,
               MAX(TO_CHAR(D.CREATEDAT, 'YYYYMMDD') || D.ID) MAX_DATA
          FROM --SUPERMAG.TTLOCPARENTLIST L,
               SUPERMAG.SMDOCUMENTS     D,
               SUPERMAG.SMSPEC          S
         WHERE D.DOCTYPE = S.DOCTYPE
           AND D.ID = S.DOCID
           AND L.PARENTID = D.LOCATIONTO
           AND D.DOCSTATE >= 3
           AND D.OPCODE = 0
           AND D.DOCTYPE = 'WI'
           AND D.CREATEDAT <= TO_DATE('20.12.2006', 'DD.MM.YYYY')
         GROUP BY D.LOCATIONTO, S.ARTICLE) T
 WHERE 1 = 1
  ) G, SUPERMAG.SMSPEC S, SUPERMAG.SMSPECTAX T
 WHERE 'WI' = S.DOCTYPE
   AND G.ID = S.DOCID
   AND G.ARTICLE = S.ARTICLE
   AND S.DOCTYPE = T.DOCTYPE(+)
   AND S.DOCID = T.DOCID(+)
   AND S.SPECITEM = T.SPECITEM(+)
 GROUP BY G.LOCID, G.ARTICLE
 
28.12.2007 10:14  
isi
ну так тогда двойное сканирование таблицы получится
 
28.12.2007 10:20  
Mtirt
Это похоже выдрано из стандартного супермажного отчета - остатки, с ценами последней поставки.
Так что все претензии по быстродействию к С+ :)
 
 


Опции темы



Часовой пояс GMT +3, время: 01:21.

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