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.
Часовой пояс GMT +3, время: 19:50.

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