2010-05-06 62 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