2010-06-23 3 views
1

В этой примерной базе данных есть две таблицы, продукты и цены. Целью является поиск наивысшей и самой низкой цены для каждого продукта.Найти высокие и низкие цены в sql

Таблица цен может иметь либо нуль, либо одну, либо две строки на продукт.

create table products(
    id int, 
    name nvarchar(50) 
) 

create table prices(
    productId int, 
    price int 
) 

insert into products (id, name) values (33,'bike') 
insert into products (id, name) values (44,'car') 
insert into products (id, name) values (55,'bus') 

insert into prices (productId, price) values (33, 10) 
insert into prices (productId, price) values (33, 40) 
insert into prices (productId, price) values (44, 300) 

SQL-запрос должен привести следующее:

productId highPrice lowPrice 
33   40   10 
44   300  NULL 
55   NULL  NULL 

ответ

1

Это дает вам таблицу, которую вы ищете (я замечаю, что другие ответы не нужна), в SQL Server 2005

select P.ID as ProductID, 
nullif(sum(case when idx=1 then price else 0 end), 0) as highPrice, 
nullif(sum(case when idx=2 then price else 0 end), 0) as lowPrice from 
(
    select productid, price, row_number() over(partition by productID order by price desc) as idx from prices 
) T 
right join products P on T.productID = P.ID 
group by P.ID 
+0

Спасибо, только что я искал – Rasmus

4
SELECT productId, 
     MAX(price) AS highPrice, 
     MIN(price) AS lowPrice 
FROM prices 
GROUP BY productId 

и если вы хотите, чтобы название продукта там, а также:

SELECT name, 
     MAX(price) AS highPrice, 
     MIN(price) AS lowPrice 
FROM products 
    LEFT OUTER JOIN prices ON ID = ProductID 
GROUP BY name 
+0

Но это не дает пользователю таблицу результатов, которые он говорит, что он после. Мы уверены, что он ошибся в том, что он написал? – Yellowfog

+0

Я сомневаюсь, что Симдендзё допустил ошибку. я просто показывал, как вы можете использовать MAX и MIN встроенные функции, чтобы получить это. если вы запустите мой второй запрос и замените «имя» на «id», вы получите тот же набор результатов из вопроса. – Miles

+0

Мальчик, почему я не видел этого простого решения. – Rasmus

4

Это для MySQL, но это может сработать и для вас.

SELECT 
products.id as productId 
, MIN(price) as highPrice 
, MAX(price) as lowPrice 
FROM products 
    LEFT JOIN prices ON products.id=prices.productId 
GROUP BY products.id 
Смежные вопросы