我有一个我可以在代码中完成的请求,但我想知道它是否完全可以单独使用SQL。我有一个产品表,其中包含Category列和Price列。我想要实现的是按类别组合在一起的所有产品,然后按类别和所有类别组合中最便宜到最贵的订购。例如:
Category | Price
--------------|---------------------
Basin | 500
Basin | 700
Basin | 750
Accessories | 550
Accessories | 700
Accessories | 1000
Bath | 700
正如你所看到的最便宜的物品是一个500的盆,然后一个配件550然后洗澡700.所以我需要的产品类别按其最便宜的项目排序,然后每个类别本身轮流到最便宜到最贵的。
我已经尝试过分区,分组(我对此一无所知),但仍然没有运气,所以最终使用了我的力量(C#),但如果可能的话,我更愿意直接在SQL中进行。最后一点注意:此查询经常被命中,因此性能是关键所以如果可能的话我想避免临时表/游标等
答案 0 :(得分:1)
我认为使用带有窗口(OVER
)的MIN()
会使更清晰意图是什么:
declare @t table (Category varchar(19) not null,Price int not null)
insert into @t (Category,Price) values
('Basin',500),
('Basin',700),
('Basin',750),
('Accessories',550),
('Accessories',700),
('Accessories',1000),
('Bath',700)
;With FindLowest as (
select *,
MIN(Price) OVER (PARTITION BY Category) as Lowest
from
@t
)
select * from FindLowest
order by Lowest,Category,Price
如果两个类别共享相同的最低价格,这仍然会将两个类别分开并按字母顺序排序。
答案 1 :(得分:0)
Select...
Order by category, price desc
答案 2 :(得分:0)
我认为,您的查询中不需要GROUP BY子句。如果我正确地得到了你的目标,你可以尝试用你的ORDER BY子句中的实际类别替换子查询中每个类别的最低价格。这样你就可以顺序获得所有类别,即不是盆地 - 500;配件 - 550,但盆地的一切都是第一。之后,您可以按每个类别中的普通价格进行分组。
SELECT *
FROM products p
ORDER BY
(SELECT MIN(Price) FROM products p2 WHERE p2.Category=p.Category
),
Price;
答案 3 :(得分:0)
SELECT p.category,p.price
FROM products p,(select category,min(price) mn from products group by category order by mn) tab1
WHERE p.category=tab1.category
GROUP BY p.category,p.price,tab1.mn
order by tab1.mn,p.category;
这是你想要的吗?