SQL Custom Order By - PullRequest
       3

SQL Custom Order By

5 голосов
/ 02 декабря 2010

Я не могу понять, почему это не работает:

select distinct a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName
    from @TempExportList a
    join tblAnswers b
    on a.QuestionID = b.QuestionID
    where a.PaperID=@PaperID
    order by (case when a.QuestionName='A' then 0
                   when a.QuestionName='B' then 1
                   else a.QuestionID
              end)

Я получаю следующую ошибку -

Элементы ORDER BY должны появляться в списке выбора, если SELECTУказан DISTINCT.

Но это прекрасно работает:

select distinct a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName
    from @TempExportList a
    join tblAnswers b
    on a.QuestionID = b.QuestionID
    where a.PaperID=@PaperID
    order by a.QuestionID

Ответы [ 3 ]

8 голосов
/ 02 декабря 2010

Сообщение об ошибке прекрасно объясняет проблему.

В первом примере элемент ORDER BY - CASE WHEN ... END - не отображается в списке SELECT.

Во втором примере элемент ORDER BY - a.QuestionID - появляется в списке SELECT.

Чтобы исправить первый пример, вам нужно сделать что-то вроде этого:

SELECT DISTINCT a.QuestionID, a.QuestionName, b.AnswerID, b.AnswerName,
                CASE WHEN a.QuestionName = 'A' THEN 0
                     WHEN a.QuestionName = 'B' THEN 1
                     ELSE a.QuestionID
                END
FROM @TempExportList AS a
    JOIN tblAnswers AS b
        ON a.QuestionID = b.QuestionID
WHERE a.PaperID = @PaperID
ORDER BY CASE WHEN a.QuestionName = 'A' THEN 0
              WHEN a.QuestionName = 'B' THEN 1
              ELSE a.QuestionID
         END
4 голосов
/ 02 декабря 2010

Вы можете обойти это с помощью CTE

;WITH T AS
(
SELECT DISTINCT a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName
    FROM @TempExportList a
    JOIN tblAnswers b
    ON a.QuestionID = b.QuestionID
    WHERE a.PaperID=@PaperID
)
SELECT   *
FROM     T
ORDER BY
         CASE
                  WHEN QuestionName='A'
                  THEN 0
                  WHEN QuestionName='B'
                  THEN 1
                  ELSE QuestionID
         END
2 голосов
/ 02 декабря 2010

Я бы подумал, что сообщение самоочевидно.

Вы выбрали отдельное имя для a.QuestionID, a.QuestionName, b.AnswerID и b.AnswerName.Следовательно, могут быть строки данных с одинаковыми соответствующими значениями для каждого из этих полей, но разные для вашего оператора case.

Учитывайте это

a.QuestionID  a.QuestionName  b.AnswerID   b.AnswerName  [case statement]

1             'One'           2            'Two'         0
1             'One'           2            'Two'         1

Какзапрос знать, какое значение в последнем столбце использовать в порядке?Это 0?Это 1?Проще говоря, он не может определить, поэтому он не может его использовать, поэтому возникает ошибка.

Второй пример подходит, потому что a.QuestionID действительно появляется в списке SELECT, и запрос может успешно применятьсязаказ.

...