本文介绍了SQL 自定义排序依据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不明白为什么这不起作用:

I can't understand why this doesn't work:

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

推荐答案

错误信息完美地说明了问题.

The error message explains the problem perfectly.

在第一个示例中,ORDER BY 项 -- CASE WHEN ... END -- 没有出现在 SELECT 列表中.

In the first example the ORDER BY item -- CASE WHEN ... END -- doesn't appear in the SELECT list.

在第二个示例中,ORDER BY 项 -- a.QuestionID -- 确实出现在 SELECT 列表中.

In the second example the ORDER BY item -- a.QuestionID -- does appear in the SELECT list.

要修复第一个示例,您需要执行以下操作:

To fix the first example you'll need to do something like this:

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

这篇关于SQL 自定义排序依据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-10 22:01