Sql 按动态、多字段排序
我的一个SQL查询中有以下语句:Sql 按动态、多字段排序,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的一个SQL查询中有以下语句: CASE WHEN @Ordering = 'asc' THEN YEAR(TimeIn) ASC, DATEPART(WEEK, TimeIn) ASC END, CASE WHEN @Ordering = 'desc' then YEAR(TimeIn) DESC, DATEPART(WEEK, TimeIn) DESC END 但我有一个错误: 味精156,15级,状态1,程序行43[批次开始行4] 关键字“ASC”附近的语法不正
CASE WHEN @Ordering = 'asc' THEN YEAR(TimeIn) ASC, DATEPART(WEEK, TimeIn) ASC END,
CASE WHEN @Ordering = 'desc' then YEAR(TimeIn) DESC, DATEPART(WEEK, TimeIn) DESC END
但我有一个错误:
味精156,15级,状态1,程序行43[批次开始行4]
关键字“ASC”附近的语法不正确
我尝试过搜索示例,但它们都与一个字段相关,而不是像我在这里尝试的那样多个字段
有人能告诉我如何更正上述内容吗?您可以重复相同的
案例
,方向在案例的结尾之后
:
ORDER BY CASE WHEN @Ordering = 'asc' THEN YEAR(TimeIn) END ASC,
CASE WHEN @Ordering = 'asc' THEN DATEPART(WEEK, TimeIn) END ASC,
CASE WHEN @Ordering = 'desc' THEN YEAR(TimeIn) END DESC,
CASE WHEN @Ordering = 'desc' THEN DATEPART(WEEK, TimeIn) END DESC
您可以重复相同的案例
,方向在案例
的结束
之后:
ORDER BY CASE WHEN @Ordering = 'asc' THEN YEAR(TimeIn) END ASC,
CASE WHEN @Ordering = 'asc' THEN DATEPART(WEEK, TimeIn) END ASC,
CASE WHEN @Ordering = 'desc' THEN YEAR(TimeIn) END DESC,
CASE WHEN @Ordering = 'desc' THEN DATEPART(WEEK, TimeIn) END DESC
这个怎么样
order by
(CASE @Ordering when 'asc' then 1 when 'desc' then -1 else 0 end)*TimeIn ASC,
(CASE @Ordering when 'asc' then 1 when 'desc' then -1 else 0 end)*DATEPART(WEEK, TimeIn) ASC
这个怎么样
order by
(CASE @Ordering when 'asc' then 1 when 'desc' then -1 else 0 end)*TimeIn ASC,
(CASE @Ordering when 'asc' then 1 when 'desc' then -1 else 0 end)*DATEPART(WEEK, TimeIn) ASC
我们可以在短时间内完成相同的任务,请尝试:
ORDER BY
CASE WHEN @Ordering = 'asc' THEN
CONCAT(YEAR(TimeIn),DATEPART(WEEK, TimeIn))
END ASC,
CASE WHEN @Ordering = 'desc' THEN
CONCAT(YEAR(TimeIn),DATEPART(WEEK, TimeIn))
END DESC
注意:CONCAT可以在SQL Server>=2012中使用,在较低版本中,我们可以使用+代替串联。我们可以用很短的方式执行相同的操作,请尝试:
ORDER BY
CASE WHEN @Ordering = 'asc' THEN
CONCAT(YEAR(TimeIn),DATEPART(WEEK, TimeIn))
END ASC,
CASE WHEN @Ordering = 'desc' THEN
CONCAT(YEAR(TimeIn),DATEPART(WEEK, TimeIn))
END DESC
注意:CONCAT可以在SQL Server>=2012中使用,在较低版本中,我们可以使用+来代替串联。问题在于ASC/DESC
,它们必须移动到CASE
表达式之外。所以我认为唯一的方法就是动态SQL。啊,好吧,那太糟糕了。真的想避免动态SQL:(问题是ASC/DESC
,它们必须移动到CASE
表达式之外。所以我认为唯一的方法是动态SQL。啊,好吧,那太糟糕了。真的想避免动态SQL:(