2010-12-02 84 views
5

我不明白为什么这不起作用:SQL自定义排序

select distinct a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName 
    from @TempExportList a 
    join tblAnswers b 
    on a.QuestionID = b.QuestionID 
    where [email protected] 
    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 [email protected] 
    order by a.QuestionID 

回答

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 
+0

谢谢。我原以为它引用了a.QuestionName和a.QuestionID不在select中,其中0,1 ... n只是一个订单号,不需要作为select的一部分。 – Bob 2010-12-02 13:23:23

+0

谢谢。错误很明显,但我认为只有列必须添加。对我来说,SQL可以非常简单,同时也很混乱-_- – ErTR 2015-01-29 18:23:32

2

我还以为该消息自explanitory。

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

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 [email protected] 
) 
SELECT * 
FROM  T 
ORDER BY 
     CASE 
        WHEN QuestionName='A' 
        THEN 0 
        WHEN QuestionName='B' 
        THEN 1 
        ELSE QuestionID 
     END