在维护分组的同时查询订购数据?

时间:2014-05-15 04:56:06

标签: sql sql-server-2008 group-by sql-order-by

我有一个我可以在代码中完成的请求,但我想知道它是否完全可以单独使用SQL。我有一个产品表,其中包含Category列和Price列。我想要实现的是按类别组合在一起的所有产品,然后按类别和所有类别组合中最便宜到最贵的订购。例如:

Category      |    Price
--------------|---------------------
Basin         |    500
Basin         |    700
Basin         |    750
Accessories   |    550
Accessories   |    700
Accessories   |    1000
Bath          |    700

正如你所看到的最便宜的物品是一个500的盆,然后一个配件550然后洗澡700.所以我需要的产品类别按其最便宜的项目排序,然后每个类别本身轮流到最便宜到最贵的。

我已经尝试过分区,分组(我对此一无所知),但仍然没有运气,所以最终使用了我的力量(C#),但如果可能的话,我更愿意直接在SQL中进行。最后一点注意:此查询经常被命中,因此性能是关键所以如果可能的话我想避免临时表/游标等

4 个答案:

答案 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;

这是你想要的吗?