Числовой порядок в Transact SQL (упорядочение как строка вместо целого числа)

У меня проблема, когда я пытаюсь упорядочить результат, установленный тем, что я считаю числовым столбцом в моей базе данных. Однако, когда я получаю набор результатов, он отсортировал столбец, как если бы это была строка (по алфавиту), вместо того, чтобы сортировать его как 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, проблем нет.

В настоящее время я использую экспресс-выпуск SQL Server 2005 и Visual Studio 2005.

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

Любая помощь приветствуется.

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

Я использую переменную 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);
}
}

Надеюсь, поможет.


person MindingData    schedule 06.05.2010    source источник
comment
@OrbMan, чистая семантика. Независимо от того, хочу ли я перейти на Asc или Desc, проблема все равно останется.   -  person MindingData    schedule 06.05.2010


Ответы (3)


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

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

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

person Cade Roux    schedule 06.05.2010
comment
Дэн хороший момент. Хорошо, я использую SortedList, здесь мы используем .net 2.0. И мне нужно было что-то с парами Key Value, но желательно, чтобы все же были индексы. Переменная Result is SortedPair Проверьте начальный пост на предмет того, как я перемещаю его в отсортированный список. Однако я скажу, что размещаю их в отсортированном списке по порядку. Затем перебираем индексы... - person MindingData; 06.05.2010
comment
Хорошо, это исправлено. У меня сложилось впечатление, что SortedList будет содержать значения индекса в том порядке, в котором я его указал. Но он сортировал себя на основе того, что он чувствовал. Переключился на словарь‹int, string› и все решил :) - person MindingData; 06.05.2010
comment
@Pyronaut - SortedList всегда упорядочен по ключам независимо от порядка вставки. Ваша проблема связана с тем, что вы используете ГГГГ/М вместо ГГГГ/ММ для создания ключей, в результате чего ключи располагаются в следующем порядке: ГГГГ/1, ГГГГ/10, ГГГГ/11, ГГГГ/12, ГГГГ/2, ГГГГ /3 и т. д. Вместо этого попробуйте (Year * 100 + Month).ToString() или сохраните как int: Year * 100 + Month. - person Cade Roux; 06.05.2010

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

As in: order by cast(datepart(year, OrderDate), int)?

person mynameiscoffey    schedule 06.05.2010
comment
DATEPART уже возвращает целые числа. Приведение к int не должно иметь значения. msdn.microsoft.com/en-us/library/ms174420.aspx - person Paul Kearney - pk; 06.05.2010
comment
Да, у меня есть :). Забыл, что использовал этот. Как упоминал ПК, это не должно иметь значения. - person MindingData; 06.05.2010

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

ORDER BY STR(DATEPART(YEAR, OrderDate), 4, 0) DESC,
         STR(DATEPART(MONTH, OrderDate), 2, 0) DESC
person Alex    schedule 06.05.2010
comment
Не сработало :(. Вполне возможно, что-то не так с моим собственным кодом, но, насколько я вижу, все, что я сделал, в порядке. Есть ли переменная среды, которая может вызвать это. Видя, что это только происходит когда я использую его в VS - person MindingData; 06.05.2010