[ОТВЕТИТЬ]
23.09.2006 14:12
Pyatak
 
подскажите как составить запрос для оракла 8и, который бы выбирал из таблици Т с полями А, Б,В все строки, в которых поле Б максимально в гуппе по полю А.
На всякий случай пример:
Исходная таблица:
А Б В
------
1 3 5
1 4 2
1 2 8
2 3 3
2 0 5

результатом должно быть:
А Б В
------
1 4 2
2 3 3
25.09.2006 06:02
reddevil
 
навскидку:
Код:
select А, substr(conc, 1,1) Б, substr(conc, 2,2) В
from
(select  А, max(Б||В) conc from t group by А)
(не проверял но похоже на правду, хотя лучше расказал бы задачу на структурк СМ проще было бы)
25.09.2006 14:23
Pyatak
 
Всё бы ничего, а что делать если длинна полей не фиксирована?

Конкретная задача вот:
Есть такой запрос:

SELECT c.article AS "Артикул",
c.name AS "Наименование",
MAX(d.createdat) AS "Дата поставки",
d.clientindex AS "Код поставщика",
round(dc.itemprice,2) AS "Цена поставки"

FROM supermag.smspec dc,
supermag.smdocuments d,
supermag.sacardclass cc,
supermag.smcard c

WHERE d.docstate > 0
AND d.doctype = 'WI'
AND dc.doctype = 'WI'
AND d.id = dc.docid
AND c.article = dc.article
AND c.idclass = cc.id

AND cc.tree LIKE '1.8.1.'
AND d.createdat > '20.08.06'

GROUP BY c.article, c.name, d.clientindex, dc.itemprice
ORDER BY c.article

он выводит список карточек по указанной группе с датой последней поставки, кодом поставщика и ценой последней поставки. Только вот если какую-либо карточку поставляло несколько поставщиков, то в результирующей таблице появляются последние поставки по одной и тойже карточке по всем поставщикам, а мне нужна только самая последня поставка
25.09.2006 14:32
reddevil
 
Цитата:
Pyatak Всё бы ничего, а что делать если длинна полей не фиксирована?
а надо было сразу реальную задачу, то что ты просил то получил правильно?
25.09.2006 14:34
reddevil
 
тегами пользуйся, ладно?
Код:
SELECT c.article AS "Артикул", 
c.name AS "Наименование", 
MAX(d.createdat) AS "Дата поставки", 
d.clientindex AS "Код поставщика", 
round(dc.itemprice,2) AS "Цена поставки" 

FROM supermag.smspec dc, 
supermag.smdocuments d, 
supermag.sacardclass cc, 
supermag.smcard c 

WHERE d.docstate > 0 
AND d.doctype = 'WI' 
AND dc.doctype = 'WI' 
AND d.id = dc.docid 
AND c.article = dc.article 
AND c.idclass = cc.id 

AND cc.tree LIKE '1.8.1.' 
AND d.createdat > '20.08.06' 

GROUP BY c.article, c.name, d.clientindex, dc.itemprice 
ORDER BY c.article
и в чем проблема? по аналогии с примером 2 поля дата и поставшик причем у даты длина фиксированная, дальше думаю поймешь .....
25.09.2006 14:35
reddevil
 
еще вот эта строчка странная или показалось?
Код:
AND cc.tree LIKE '1.8.1.'
25.09.2006 14:44
OlegON
 
А мне еще и следующая показалась некорректной... Строку надо к дате привести.
25.09.2006 15:34
Pyatak
 
В чем странность этой строчки?
Код:
AND cc.tree LIKE '1.8.1.'
Замечательно отбирает только те карточки, которые входят в группу 1.8.1.
На счет следующей строчки, то её oracle тоже прекрасно понимает, ну да не это важно, потом подправлю как надо, главное это суть запроса. А проблема заключается в том, что таким способом дата 31.08.06 будет больше чем, например 01.09.06, так как даты в таком случае сравниваются как строки, а не как числа. Попробую тогда сформулировать задачу проще: в результирующей таблице получить артикул и номер_документа, где номер_документа - номер последнего документа типа WI в котором встречается артикул Выборку сделать по всем артикулам из таблици smcards. Предположение, что чем больше номер документа, тем он позднее был создан - не верно.
25.09.2006 15:39
Mtirt
 
Зачем тогда LIKE использовать? Кода у тебя в условии прямое равенство. И работает гораздо быстрее...
Для LIKE:
Код:
AND cc.tree LIKE '1.8.%'
25.09.2006 15:42
Mtirt
 
Я бы почитала про аналитические функции oracle.
25.09.2006 15:55
OlegON
 
Уверен, что нет необходимости использовать именно эту функцию, но
Код:
select distinct first_value(column) over(order by column ASC ROWS UNBOUNDED PRECEDING
не определено все таки, какой документ считать последним. Ибо, можно по rownum последнего выделять, что не есть правильно. Правильнее все таки по дате. Возьми дату по max() и все...
25.09.2006 18:41
Pyatak
 
Я и имел ввиду по дате, видимо не упомянул.

Ладно, всем спасибо, что-то получилось. Может быть это и не самый оптимальный запрос, но выдает нужный результат и работает быстро.
Код:
SELECT  carticle AS "Артикул",
        c.name AS "Наименование",
        d.id AS "Накладная",
        d.createdat AS "От",
        d.clientindex AS "Поставщик",
        ci.name AS "Наименование поставщика",
        round(dc.itemprice,2) AS "Цена",
        sspeed AS "Скорость продаж по сети"
  FROM
       supermag.smdocuments d,
       supermag.smspec dc,
       supermag.smcard c,
       supermag.smclientinfo ci,
       (select distinct
               c.article AS carticle,
               MAX(TO_DATE(d.createdat,'YY-MM-DD')||d.id) conc

         FROM supermag.smspec dc,
              supermag.smdocuments d,
              supermag.sacardclass cc,
              supermag.smcard c

        WHERE d.docstate > 0
          AND d.doctype = 'WI'
          AND dc.doctype = 'WI'
          AND d.id = dc.docid
          AND c.article = dc.article
          AND c.idclass = cc.id

          AND cc.tree LIKE :smrGroup
          AND TO_DATE (d.createdat) BETWEEN :smrdatestart
                                        AND :smrdateend

       GROUP BY c.article
       ),
      (SELECT ss.article AS sarticle,
              SUM(ss.salerate) AS sspeed
         FROM supermag.smstocklevels ss
       GROUP BY ss.article)

 WHERE d.id = substr(conc,9,32)
   AND d.doctype = 'WI'
   AND dc.doctype = 'WI'
   AND dc.docid = d.id
   AND dc.article = carticle
   AND c.article = carticle
   AND ci.id = d.clientindex
   AND sarticle = carticle
Опции темы


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

 

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