【问题标题】:Calculate days in between certain events based on multiple conditions根据多个条件计算某些事件之间的天数
【发布时间】:2019-12-25 23:20:58
【问题描述】:

我很好奇你们中是否有人能帮我计算出某条船BoatID 仅用于豪华旅行BoutTourID = Luxury 由不同船长@ 987654326@, 现在是奇怪的部分:直到下一个标准巡回赛BoutTourID = Standard 开始。我不想将已取消的行程考虑在内Status = Cancelled

CaptainID       BoatID      BoatTourID  Status      TravelStart TravelEnd
Jack            AlphaBoat   Standard                1-7-2019    20-7-2019
Kevin           AlphaBoat   Luxury                  21-7-2019   31-7-2019
Eric            AlphaBoat   Luxury      Cancelled   1-8-2019    10-8-2019
Nick            AlphaBoat   Standard                11-8-2019   20-8-2019
John            AlphaBoat   Luxury                  21-8-2019   30-8-2019
Lionel          BigBoat     Standard                1-8-2019    20-8-2019
Jeffrey         BigBoat     Luxury                  20-8-2019   25-8-2019
Chris           BigBoat     Standard                26-8-2019   28-8-2019

这在 SQL 中应该给出以下结果,因此在基础表中显示的记录数量完全相同:

CaptainID   
Jack        0   --since BoatTourID = Standard, it should not be calculated
Kevin       10
Eric        0   --since Status = Cancelled
Nick        0
John        9
Lionel      19
Jeffrey     5
Chris       2

应该可以在 1 个 SQL 查询中运行它。

到目前为止我写的代码很乱,还没有接近解决它,所以我宁愿不发布它,因为我希望有一个新的想法。以防万一我仍然会发布它,如果需要的话!

【问题讨论】:

标签: sql-server sql-server-2012


【解决方案1】:

您可以通过CASE 表达式和group by 来实现它。您可以根据需要在selectgroup by 子句中添加其他列

select CaptinID,
       DATEDIFF( DAY,
       MIN (CASE WHEN 
            BoutTourID = 'Luxury' and NOT [Status] = 'Cancelled'
            THEN TravelStart Else cast( GETDATE() as date ) ), 
       MAX (CASE WHEN 
            BoutTourID = 'Luxury' and NOT [Status] = 'Cancelled'
            THEN TravelEnd Else cast ( GETDATE() as date ) )
              ) Duration_Days
from yourtbale
Group by CaptinID

MINMAXGroup by 将帮助您在整个行程中每 CaptinID 持续时间获得一条线路。如果不需要 captin 的整个行程,您可以更改删除 group by 只需相应地使用 CASE 表达式..

【讨论】:

  • 这行得通……但只是因为在样本数据中每个船长只有一行,我认为这不是一个安全的假设。如果给定船长用于两次旅行,则此查询将获得错误的最小/最大日期并返回错误的结果。然而,鉴于数据,它确实返回了正确的结果......但经验告诉我,样本数据很少反映真实数据。
  • @TechGnome,同意,因此在答案中添加了解释。
【解决方案2】:

下面的查询应该做你想做的事:

SELECT 
    CaptainID
    ,CASE WHEN BoatTourID = 'Standard' OR [Status] = 'Cancelled' THEN 0
        ELSE DATEDIFF(DAY,TravelStart,TravelEnd) AS [Date Difference]
FROM YourTable

【讨论】:

  • 我认为这会比其他答案产生更好、更准确的结果。特别是如果船长被多次使用。在这种情况下,他们会得到不止一行,然后可以通过将上面的案例包装在 SUM 中并按 CaptainId 分组来进一步解决这个问题
猜你喜欢
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多