Числовой порядок в языке Transact SQL (порядок в виде строки вместо Int) - PullRequest
1 голос
/ 06 мая 2010

У меня проблема с тем, что я пытаюсь упорядочить набор результатов по числовому столбцу в моей базе данных. Однако когда я получаю набор результатов, он сортирует столбец, как если бы он был строкой (в алфавитном порядке), а не сортирует его как целое число.

В качестве примера. У меня есть эти цифры,

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

DO NOTE Неправильная сортировка происходит только тогда, когда я вызываю функцию из 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 Edition и Visual Studio 2005.

Я перепробовал множество вещей, разбросанных по сети. В том числе с использованием Convert () и ABS () безрезультатно.

Любая помощь будет высоко ценится.

РЕДАКТИРОВАТЬ: Кто-то поднял вопрос о том, что я делал с ними после того, как читатель вернул их ...

Я использую переменную SortedList под именем «results».

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 ]

2 голосов
/ 06 мая 2010

Вы уверены, что они на самом деле возвращаются из вашего DataReader в другом, чем ожидалось (int) порядке? Доверяй, но проверяй (в отладчике).

Вы не показали нам, как вы извлекаете его из DataReader и во что вы помещаете его.

Если вы поместите их в упорядоченную коллекцию, в которой столбец int преобразуется (возможно, неявно) в строку (скажем, Dictionary<string, string>), вы увидите ту же проблему, что и в своей DataGrid, независимо от Порядок их возврата из DataReader. В этом случае, опять же, это на самом деле не проблема SQL / SQLClient.

1 голос
/ 06 мая 2010

Вы пытались использовать Cast (значение как int)?

Как в: order by cast(datepart(year, OrderDate), int)?

0 голосов
/ 06 мая 2010

Вы пробовали использовать приведение к строке? STR функция возвращает выровненный по правому краю результат, поэтому порядок должен быть правильным в любом случае:

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