ORDER BY,为第一个索引设置一个特定的案例?

时间:2011-07-15 13:55:43

标签: sql sql-server sql-server-2008

使用SQL Server 2008 ...

我在尝试按特定顺序排序我的行时遇到了一些麻烦,我希望他们按顺序排序。我发现了一些使用ORDER BY CASE子句的示例,但我不确定使用此方法是否会产生我想要的结果,因此我来到了社区!

这就是我所拥有的:

首先,如果存在,我会选择与当前年份相同的年份:

IF EXISTS(SELECT DISTINCT [Year]
FROM Assessment WHERE ProjectCode = @ProjectCode AND [Year] = DATENAME(YEAR, GETDATE()))

SELECT DISTINCT [Year]
FROM Assessment WHERE ProjectCode = @ProjectCode

但是,我在排序结果时发现了一些困惑。我想将当前年份设置为使用ORDER BY子句返回的第一行,然后按降序排列其余的返回年份,这是我到目前为止所做的:

ORDER BY (CASE WHEN [Year] = (DATENAME(YEAR, GETDATE())) THEN 1
          ELSE 100 END) ASC, [Year] desc

接下来,如果查询中未包含当前年份,请选择每年并逐年下降。

    ELSE
SELECT DISTINCT [Year]
FROM Assessment WHERE ProjectCode = @ProjectCode
ORDER BY [Year] desc

先谢谢!

3 个答案:

答案 0 :(得分:5)

您根本不需要条件语句:

SELECT  *
FROM    (
        SELECT  DISTINCT [Year]
        FROM    Assessment
        WHERE   projectCode = @projectCode
        ) q
ORDER BY
        CASE [Year] WHEN YEAR(GETDATE()) THEN 1 ELSE 2 END,
        [Year]

将首先输出当前年份(如果存在),然后输出另一年。

答案 1 :(得分:1)

您的问题不是很明确,因为您没有指明哪些内容或哪些内容存在问题。然而,从我收集的内容来看,您不需要IF / ELSE。相反,你可以做点像......

SELECT DISTINCT [Year],  
        CASE [Year] 
            WHEN DATENAME(Year, GETDATE()) THEN 9999
            ELSE [Year] END  AS GarbageSoDistinctWorks
FROM Assessment 
WHERE ProjectCode = @ProjectCode
ORDER BY
        CASE [Year] 
            WHEN DATENAME(Year, GETDATE()) THEN 9999
            ELSE [Year] END  DESC 

仅供参考...我将这个案例添加到选择列表作为一个扔掉的列,以避免我假设你得到的错误..还有其他方法,如派生表,但现在这应该工作..

Msg 145, Level 15, State 1, Line 2
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

HTH, -eric

答案 2 :(得分:0)

您的示例代码似乎按照您的描述进行操作。你有什么问题?

作为旁注:您不需要IF语句。通过使用第一个示例中的ORDER BY(使用CASE语句),您将获得两种方案的正确结果。
- 如果您的数据中包含“今年”,则首先出现。其他所有内容都以DESC的顺序出现 - 如果您的数据中没有“今年”,您只需按照DESC顺序获取其他所有内容