具有多个场景的SQL Order by

具有多个场景的SQL Order by,sql,sql-order-by,Sql,Sql Order By,我有一个复杂的SQL查询,我想根据某些条件操作结果数据 下面是我的数据结构。它是3个表的组合,允许存储不同的活动及其注册周期 下面是一个基本查询(更复杂查询的一部分): 我想要实现的目标 我必须在以下条件下订购此数据,优先顺序为vise 显示现在先注册的程序(所以我想今天应该介于StartDateTime和EndDateTime之间) 即将结束,(结束日期离今天最近) 即将开业(开始数据最接近今天) 我到目前为止所做的尝试 我试着创建一个临时表并存储每个条件的数据(尽管这不能正常工作),但

我有一个复杂的SQL查询,我想根据某些条件操作结果数据

下面是我的数据结构。它是3个表的组合,允许存储不同的活动及其注册周期

下面是一个基本查询(更复杂查询的一部分):

我想要实现的目标

我必须在以下条件下订购此数据,优先顺序为vise

  • 显示现在先注册的程序(所以我想今天应该介于StartDateTime和EndDateTime之间)
  • 即将结束,(结束日期离今天最近)
  • 即将开业(开始数据最接近今天)
我到目前为止所做的尝试

我试着创建一个临时表并存储每个条件的数据(尽管这不能正常工作),但如果可能的话,我考虑订购它,这就是为什么我把这个问题带到这里,以便有经验的so可以指导我

任何帮助都将不胜感激。谢谢

更新的查询:

select 
    act.ID, act.Name, arp.RegistrationPeriodId, 
    rp.StartDateTime, rp.EndDateTime 
from
    Activity act
join 
    ActivityRegistrationPeriod arp on arp.ActivityId = act.ID
join
    RegistrationPeriod rp on rp.Id = arp.RegistrationPeriodId
--where 
--  act.AccountId = 3106
order by 
    (case when GETDATE() between StartDateTime and endDateTime then 1 else 2 end),
    (case when rp.EndDateTime is null then 2 else 1 end), 
    rp.EndDateTime asc,
    (case when rp.StartDateTime is null then 2 else 1 end), 
    rp.StartDateTime desc

您可以使用
大小写
表达式:

order by (case when current_date between StartDateTime and endDateTime then 1 else 2 end),
         endDateTime asc,
         StartDateTime desc

请用您正在使用的DBMS标记您的问题。请以可编辑文本/表格(而非图片)形式提供样本日期,并包括列标题。请提供您希望看到的输出(基于您提供的样本数据)以及您希望用于推导结果的精确逻辑output@GordonLinoff我已经更新了这个问题,基本上它意味着第一个订单将是如果有任何活动正在注册。第二个将是即将关闭的,等等。谢谢@gordon,看起来它会工作,但我仍然需要为null和其他事情优化它。@Bharat。我想这回答了你在这里问的问题。是的,是……戈登,你能检查一下更新的查询吗,我正在尝试通过order by首先引入非空值。这和我在《质疑》中所做的一样好吗?@Bharat。这似乎是合理的。
order by (case when current_date between StartDateTime and endDateTime then 1 else 2 end),
         endDateTime asc,
         StartDateTime desc