SQL自定义顺序依据

时间:2010-12-02 13:13:42

标签: sql-server-2008 sql-order-by

我无法理解为什么这不起作用:

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 个答案:

答案 0 :(得分:8)

错误信息完美地解释了问题。

在第一个示例中,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

答案 1 :(得分:4)

你可以通过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 :(得分:2)

我会认为这个消息是自我解释的。

您已在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列表中,并且查询可以愉快地应用排序。