使用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
先谢谢!
答案 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顺序获取其他所有内容