Transact SQL中的数字顺序(作为字符串而不是Int排序)

时间:2010-05-06 02:07:25

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

我有一个问题,我试图按照我认为是数据库中的数字列来命令结果集。但是当我得到结果集时,它已经将列排序为好像是一个字符串(按字母顺序排列),而不是将其排序为int。

举个例子。我有这些数字,

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

当我在Transact 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 Server中运行语句时,没有问题。

我目前正在使用SQL Server 2005 Express Edition和Visual Studio 2005.

我尝试了很多遍布网络的东西。包括使用Convert()和ABS()无济于事。

非常感谢任何帮助。

编辑:在datareader返回后,有人提出了我正在做的事情......

我使用名为“results”的SortedList变量。

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);
}
}

希望它有所帮助。

3 个答案:

答案 0 :(得分:2)

你确定它们实际上是以非预期(整数)顺序从你的DataReader返回的吗?信任但验证(在调试器中)。

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

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

答案 1 :(得分:1)

您是否尝试过使用Cast(值为int)?

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

答案 2 :(得分:0)

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

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