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”附近的语法不正

我的一个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”附近的语法不正确

我尝试过搜索示例,但它们都与一个字段相关,而不是像我在这里尝试的那样多个字段


有人能告诉我如何更正上述内容吗?

您可以重复相同的
案例
,方向在
案例的
结尾之后

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:(