как заказать строку логически - PullRequest
1 голос
/ 10 января 2011

Q:

У меня есть следующий случай:

набор букв (оценок) A, A +, A-, B, B +, B- хранятся в виде строк в базе данных. Я хочуупорядочить эти оценки логически от малого к большему, но это не то, что происходит в действительности .. потому что это строки, порядок:

A, A +, A-я хочу

ASC

A-, A, A +

DESC

A +, A, A-

я связываю эти оценкив выпадающем списке, и я хочу эти оценки с этим логическим порядком в нем ..

Есть ли идея, как сделать что-то вроде этого ..

Ответы [ 7 ]

10 голосов
/ 10 января 2011

Ведите отдельную таблицу, в которой перечислены оценки и порядок их следования:

Grade | SortOrder
B-    | 20
B     | 30
B+    | 40
A-    | 50
A     | 60
A+    | 70

Тогда ваш запрос на выборку может сделать INNER JOIN для этой таблицы и ORDER BY SortOrder.

5 голосов
/ 10 января 2011

Преобразование оценок в числовое представление, а затем сортировка по ним.

2 голосов
/ 10 января 2011

Очень грубая реализация:

public double getScore(String grade)
{
    grade = grade.ToUpper();
    if(grade.Length > 2 || grade.Length <= 0)
    {
        throw new ArgumentException();
    }
    var baseGrade = (double)grade[0];
    if(baseGrade < 65 || baseGrade > 90)
        throw new ArgumentException();

    if(grade.Length == 2)
    {
        var gradeShift = grade[1];
        switch(gradeShift)
        {
            case '+':
                baseGrade -= 0.3;
                break;
            case '-':
                baseGrade += 0.3;
                break;
            default:
                throw new ArgumentException();
        }
    }

    return baseGrade * -1 + 90.5;
}
1 голос
/ 10 января 2011

В этом случае вы можете использовать счетчики, чтобы упростить сортировку.

1 голос
/ 10 января 2011

Вот рабочее решение:

WITH ExamResults AS
(
    SELECT 1 ResultId, 'Joe Blow' Student, 'A-' Grade
    UNION ALL SELECT 2, 'Leroy Jones', 'B+'
    UNION ALL SELECT 3, 'Paul Smith', 'B-'
    UNION ALL SELECT 4, 'Helen Potter', 'B'
),
Suffix AS
(
    SELECT '+' Suffix, 1 [Rank]
    UNION ALL SELECT '', 2
    UNION ALL SELECT '-', 3
),
Grade AS
(
    SELECT DISTINCT Grade, LEFT(Grade, 1) Letter, SUBSTRING(Grade, 2, 1) Suffix
    FROM ExamResults
)
SELECT ExamResults.*,
    Grade.Letter,
    Grade.Suffix,
    Grade.Letter + CAST(Suffix.[Rank] AS char(1)) GradeOrder
FROM ExamResults
    JOIN Grade ON Grade.Grade = ExamResults.Grade
    JOIN Suffix ON Suffix.Suffix = Grade.Suffix
ORDER BY
    Grade.Letter,
    Suffix.[Rank]

Вывод:

ResultId    Student      Grade Letter Suffix GradeOrder
----------- ------------ ----- ------ ------ ----------
1           Joe Blow     A-    A      -      A3
2           Leroy Jones  B+    B      +      B1
4           Helen Potter B     B             B2
3           Paul Smith   B-    B      -      B3
1 голос
/ 10 января 2011

Вот оператор выбора SQL для таблицы (Table1), содержащей поле Grade.

select Grade
from Table1
order by
    case Grade
        when 'A+' then 5
        when 'A'  then 4
        when 'A-' then 3
        when 'B+' then 2
        when 'B'  then 1
        when 'B-' then 0
        else -1     
    end asc
1 голос
/ 10 января 2011

Используйте числа, представляющие оценки

Или операторы сравнения перегрузки

...