2010-05-06 96 views
1

我遇到了一个问题,我试图通过我认为是数据库中的数字列来排序结果集。但是,当我得到结果集时,它已经对列进行了排序,就好像它是一个字符串(所以按字母顺序排列),而不是将其排序为int。在Transact SQL中数字排序(以字符串排序而不是Int排序)

作为一个例子。我有这些数字,

1,2,3,4,5,10,11

当我在处理SQL命令由,我回来:

1,10,11,2, 3,4,5

我和Datagridview有一样的问题,而问题是因为排序被当成字符串来完成。我假设这里发生了同样的事情。

我的完整的SQL代码:

SELECT TOP (12) DATEPART(YEAR, [OrderDate]) AS 'Year', DATEPART(MONTH, [OrderDate]) AS 'Month' , COUNT(OrderRef) AS 'OrderCount' 
FROM [Order] 
WHERE [Status] LIKE('PaymentReceived') OR [Status] LIKE ('Shipped') 
GROUP BY DATEPART(MONTH, [OrderDate]), DATEPART(YEAR, [OrderDate]) 
ORDER BY DATEPART(YEAR, OrderDate) DESC, DATEPART(MONTH, OrderDate) desc 

待办事项 错误的排序,只有当我打电话凸轮从Visual Studio的功能情况。在我的代码是:

using (SqlConnection conn = GetConnection()) 
      { 
       string query = @"SELECT TOP (12) DATEPART(YEAR, [OrderDate]) AS 'Year', DATEPART(MONTH, [OrderDate]) AS 'Month' , COUNT(OrderRef) AS 'OrderCount' 
           FROM [Order] 
           WHERE [Status] LIKE('PaymentReceived') OR [Status] LIKE ('Shipped') 
           GROUP BY DATEPART(MONTH, [OrderDate]), DATEPART(YEAR, [OrderDate]) 
           ORDER BY DATEPART(YEAR, OrderDate) DESC, DATEPART(MONTH, OrderDate) desc"; 
       SqlCommand command = new SqlCommand(query, conn); 
       command.CommandType = CommandType.Text; 

       using (SqlDataReader reader = command.ExecuteReader()) 

等当我在SQL服务器中运行语句,没有问题。

我目前使用SQL Server 2005 Express版本,和Visual Studio 2005

我已尝试在网路上散布大量的东西。包括使用Convert()和ABS()无效。

任何帮助将不胜感激。

编辑:有人提出了什么,我与他们做后,DataReader的返回他们的问题......

我使用一个排序列表变量“结果”的名义下。

using (SqlDataReader reader = command.ExecuteReader()) 
{ 
while (reader.Read()) 
{ 
string Date = reader["Year"].ToString() + "/" + reader["Month"].ToString(); 
string Orders = reader["OrderCount"].ToString(); 
results.Add(Date, Orders); 
} 
} 

希望它有帮助。

+0

@OrbMan,纯语义。无论我是否想要使用Asc或Desc,问题仍将存在。 – MindingData 2010-05-06 02:35:48

回答

2

你确定他们是真正从DataReader的其他恢复低于预期(int)的顺序?信任但验证(在调试器中)。

您没有告诉我们您是如何将它从DataReader中取出来的,以及您将它放入的内容。

如果你把它们放在某种有序的集合中,int列被转换成(也许是隐含的)字符串(比如说,Dictionary<string, string>),你会看到你在DataGrid中看到的同样的问题,无论订单他们从DataReader返回。在这种情况下,再一次,这不是一个真正的SQL/SQLClient问题。

+0

当中使用它时,好吧,好吧,我使用的是“SortedList”,我们在这里使用的是.NET 2.0,我需要一些关键值对,但最好还是有索引。结果是SortedPair 检查初始帖子,了解如何将它移动到排序列表中 但是我会说我将它们放入排序列表中,然后遍历索引... – MindingData 2010-05-06 03:27:36

+0

好了,修复它。根据SortedList将按照我给出的顺序保存索引值的印象,但它是根据自己的感觉进行排序。切换到字典,它解决了一切:) – MindingData 2010-05-06 03:47:06

+0

@Pyronaut - 无论插入的顺序如何,SortedList总是按键排序。您的问题是由于您使用YYYY/M而不是YYYY/MM来制作键,导致键的顺序如下:YYYY/1,YYYY/10,YYYY/11,YYYY/12,YYYY/2,YYYY/3等。请改为(年* 100 +月).ToString()或保留为int:年* 100 +月。 – 2010-05-06 13:19:47

1

你试过使用Cast(value为int)吗?

如:order by cast(datepart(year, OrderDate), int)

+0

DATEPART已经返回整数。投到int不应该有所作为。 http://msdn.microsoft.com/en-us/library/ms174420.aspx – 2010-05-06 02:12:01

+0

是的,我有:)。忘记了我曾用过那个。正如PK提到的,不应该有所作为。 – MindingData 2010-05-06 02:16:26

0

您是否尝试过使用强制转换为字符串? STR函数返回右对齐的结果,所以顺序应该在任何情况下是正确的:

ORDER BY STR(DATEPART(YEAR, OrderDate), 4, 0) DESC, 
     STR(DATEPART(MONTH, OrderDate), 2, 0) DESC 
+0

没有工作:(它可能可能是我自己的代码有问题,但据我所知,我所做的一切都很好。 是否有环境变量可能会导致此问题?只是当我在VS – MindingData 2010-05-06 03:13:32