2014-12-17 3 views
-2

Я пытаюсь выработать min и max цену на столе предметов:«мин» и «макс» не работает с другой информацией

item [itemcode] [itemname] [iteminfo] [price] 

Я хочу, чтобы получить не только мин и максимальная цена, но также и то, что элемент: , поэтому результат запроса должен быть самым дешевым элементом, item item item info, а затем хотите изменить синтаксис для его максимальной версии. Самый дорогой предмет, имя и товар и т. Д. выберите мин (цена) с позиции

Это прекрасно работает. Возвращает минимальное значение с max. Но, когда я пытаюсь получить информацию о товаре, он возвращает все строки таблицы не только одной строки, где она самая дешевая или самая дорогая. Например:

select min(price) as lowest, itemcode, itemname, iteminfo 
from item 
group by itemname 

Я не уверен, что я делаю неправильно? Может кто-нибудь мне помочь?

+0

При использовании Oracle, ваш «например» запрос будет включать ORA-00979 точно. Он не может «вернуть все строки», он ничего не может вернуть по дизайну. Поэтому, пожалуйста, покажите свой истинный выбор и некоторые его результаты. –

+0

, используя oracle, запрос также работает, но он возвращает все строки таблицы, если я запустил его, чтобы получить только самую низкую цену и максимальную цену, я получаю это в порядке, но когда я хочу знать, что такое элементы, вот где он не работает, я мог бы заказать таблицу, например, сказал Дирк, но, пытаясь получить минимальную цену товара и его информацию только за одну строку данных, я могу получить минимальную цену в полном порядке, но если я хочу, чтобы остальная часть линии doesnt work –

ответ

0

попробовать Это ...

select itemcode, itemname, iteminfo, price 
from item 
where item.price in (
    select min(price) from item 
    union 
    select max(price) from item) 

, если вы хотите, чтобы результаты отдельно, то это будет ... низких

select itemcode, itemname, iteminfo, price 
from item 
where item.price = (
    select min(price) from item) 

высокого

select itemcode, itemname, iteminfo, price 
from item 
where item.price = (
    select max(price) from item) 

Обратите внимание, что это будет вернуть все предметы с самой низкой/самой высокой ценой ... Если несколько позиций c ост $ 1, как будут возвращены

+0

все еще возвращает все строки не только min (price row) –

+0

Извините. Я пропустил вопрос ... Я обновил свой ответ – Spock

1

Может быть, это поможет (он всегда будет возвращать только один элемент, даже если есть и другие детали с той же цене):

SELECT itemcode, 
     itemname, 
     iteminfo, 
     price 
    FROM(SELECT itemcode, 
       itemname, 
       iteminfo, 
       price, 
       ROW_NUMBER() OVER (ORDER BY price) AS rn 
     FROM item 
    ) 
WHERE rn = 1; 

Если вы хотите, чтобы все элементы с Самая низкая цена, вы можете заменить ROW_NUMBER() OVER (ORDER BY price) AS rn на DENSE_RANK() OVER (ORDER BY price) AS rn.

Если вы хотите товар с максимальной ценой, просто измените ORDER BY price на ORDER BY price DESC.

+0

ROW_NUMBER() не вернет правильный результат, если есть более одного элемента с самой низкой или самой высокой ценой. – APC

+0

Вы правы. Это не совсем ясно, если OP хочет только один предмет (даже если их больше одной с той же ценой), или если он хочет все предметы с самой низкой (самой высокой) ценой. Если это так, замените 'ROW_NUMER()' на 'DENSE_RANK()' должно это сделать. – DirkNM

0

решение Простейшее для минимума:

select price as lowest, itemcode, itemname, iteminfo 
from item 
where price = (select min(price) price from item) 

Эквивалент сотворит для максимума.

Существуют различные способы расчета min и max, и если вы хотите получить оба в одном запросе, вы можете использовать аналитику. Здесь я использовал функцию RANK(), потому что она правильно обрабатывает сценарий, когда более одного элемента имеет самую низкую или самую высокую цену.

select case when maxp = 1 then 'HIGHEST' else 'LOWEST' end as type 
     , price 
     , itemcode 
     , itemname 
     , iteminfo 
from (
     select price 
       , itemcode 
       , itemname 
       , iteminfo 
       , rank() over (order by price desc) maxp 
       , rank() over (order by price asc) minp 
     from item 
    ) 
where maxp = 1 
or minp = 1 

Аналитическое решение имеет то преимущество, что только один раз прочитал таблицу. Эта эффективность важна для больших таблиц, особенно если колонка, которую мы используем, не индексируется. Поэтому в реальной жизни я всегда буду аналитическую версию, а не более простую версию, с которой я веду.

Аналитические функции чрезвычайно мощные. Find out more.

+0

Это не вернет самую низкую цену за товарное имя – beny23

+1

@ beny23 OP хочет только элемент с наименьшей (или самой высокой) ценой – DirkNM

+0

Извинения, неверный вопрос – beny23

0

Если необходимо отобразить строку с Mininum цены для конкретного ITEMNAME любезно использовать ниже

with item1 as 
(select price, itemcode, itemname, iteminfo 
from item 
), item2 as(select min(price) as lowest,itemname from item1 
group by itemname) 

select lowest,itemcode,item1.itemname,iteminfo 
from item1,item2 
where item1.itemname=item2.itemname 
and item1.price=item2.lowest