SQL订单由[Order]组成,但将相似的项目组合在一起

时间:2014-02-05 07:01:49

标签: c# sql sql-server linq

很抱歉,如果我真的不知道这个条款的话,我会尽力解释这个......

这就是我现在所拥有的

SELECT * FROM Products ORDER BY [Order]

 Order  ProductId  Color
   1       10      Black
   2       59      Black
   3       10      White
   4       48      Black

(表格简化,真实表格约有30,000条记录)
但这就是我真正想要的东西

 Order  ProductId  Color
   1       10      Black
   3       10      White
   2       59      Black
   4       48      Black

所以我希望它按[Order]排序,但保持相同的ProductId靠近,所以第3行应该向上移动到第一行,因为他们的ProductId是相同的(即10)

这是否可行? 如果在SQL Server查询中不可能,那么在LINQ中有没有简单的方法呢?

4 个答案:

答案 0 :(得分:5)

几乎听起来像真的希望按顺序排序,主要是 - 您希望按产品ID和排序订购。所以:

SELECT * FROM Products ORDER BY ProductId, [Order]

在LINQ查询表达式中:

var results = from product in db.Products
              orderby product.ProductId, product.Order
              select product;

或:

var results = db.Products.OrderBy(p => p.ProductId).ThenBy(p => p.Order);

但是,如评论中所述,这将给最后两行的错误订单。

如果您真的在“使用订单作为主键,但随后在该组中以不同的顺序加息”,那么这有点棘手。我不确定你在寻找什么在SQL中很容易代表... ORDER BY我真的假设你希望你的主要订购是一个真正的主要订购......

您可以在LINQ中尝试 - 我不知道等效的SQL是什么,或者它是否真的有用......

var results = db.Products
                .OrderBy(g => g.Order)
                .GroupBy(p => p.ProductId)
                .SelectMany(g => g);

在LINQ to Objects中我相信会起作用 - 但目前还不清楚它是否会出现在LINQ to SQL中。

答案 1 :(得分:2)

如果您使用的是适度最新的SQL Server,这应该可以使用:

declare @t table ([Order] int not null,ProductId int not null,
                  Color char(5) not null)
insert into @t ([Order],ProductId,Color) values
(1,10,'Black'),
(2,59,'Black'),
(3,10,'White'),
(4,48,'Black')

select * from
(
    select *,MIN([Order]) OVER (PARTITION BY ProductId) as Ord
    from @t
) t
order by Ord,[Order]

对于每个ProductId,我希望可读的是 - 对于每个Order,使用ProductId的最低Order值作为主要排序键,然后使用该行的特定{{1}}值作为辅助排序键。

答案 2 :(得分:0)

我认为你的意思是这个 -

SELECT * FROM Products ORDER BY [ProductId] ASC, [Order] ASC

答案 3 :(得分:0)

试试这个:

SELECT * FROM Products ORDER BY ProductId, Order