【问题标题】:How to declare variable within a SELECT?如何在 SELECT 中声明变量?
【发布时间】:2021-03-15 20:27:00
【问题描述】:

我有一个计算报告刷新时间的长查询,如果报告没有在“计划”时间刷新,那么它会延迟显示,根据以下情况:

SELECT
RefreshStartStatus      =   CASE 
                                WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
                                WHEN DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime) < 30 THEN 'Less than half hour late!' -- less than 30 mins late
                                WHEN DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime) >= 30 THEN 'More than half hour Late!' -- 30 mins late
                                ELSE '???'
                                END
FROM #CSTempTable CS

LEFT OUTER JOIN #SubscriptionAggTempTable SA
    ON SA.SubscriptionID = CS.SubscriptionID

我想进一步增强这一点,并显示实际时间有多晚。

由于我使用过脚本(例如 PowerShell),所以它会很简单

WHEN DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime) < 30 THEN "$(DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime)) late!"

但当然,这里的 SQL 查询不是这种情况,那么我将如何输出延迟多长时间的实际值?我想过像这样声明和设置一个标量变量:

DECLARE @timing int;
SET @timing = DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime);

WHEN @timing < 30 THEN @timing + ' mins late!'

但我不知道如何在 SELECT 语句中执行此操作,因为由于执行差异所需的连接,该值是在其中生成的...

结果是这样的:

SELECT

DECLARE @timing int;
SET @timing = DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime);

RefreshStartStatus      =   CASE 
                                WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
                                WHEN timing < 30 THEN @timing + ' mins late! a little late' -- less than 30 mins late
                                WHEN timing >= 30 THEN timing + ' mins Late! VERY LATE!' -- 30+ mins late
                                ELSE '???'
                                END
FROM #CSTempTable CS

LEFT OUTER JOIN #SubscriptionAggTempTable SA
    ON SA.SubscriptionID = CS.SubscriptionID

【问题讨论】:

  • 您可以在一个语句号内开始一个语句。如果你需要创建变量,你需要DECLARE他们SELECT之外

标签: sql sql-server tsql left-join lateral-join


【解决方案1】:

如果我没听错的话,你可以使用VALUES() 和横向连接只进行一次计算:

SELECT
    CASE 
        WHEN CS.StartTime > CURRENT_TIMESTAMP THEN 'STARTING LATER'
        WHEN x.timing <  30 THEN 'Less than half hour late!' 
        WHEN x.timing >= 30 THEN 'More than half hour Late!'
        ELSE '???'
    END as RefreshStartStatus,
    CASE WHEN CS.StartTime <= CURRENT_TIMESTAMP THEN CONCAT(x.timing ' mins late') END as info
FROM #CSTempTable CS
LEFT OUTER JOIN #SubscriptionAggTempTable SA ON SA.SubscriptionID = CS.SubscriptionID
CROSS APPLY (VALUES (DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime))) as x(timing)

【讨论】:

  • 这太完美了!!您还给了我一个好主意,可能将它们分成几列,我认为这会使过滤效果更好(例如,如果他们想过滤一点点晚或非常晚),这样他们就可以在单独的信息中看到它有多晚了柱子。喜欢这个答案!
  • 这里(x.timing ' mins late') 好像少了一个逗号。同样,当它达到'???' 状态时,它会在信息中输出“mins late”,这是预期的,但是如果表达式被评估为 ???
  • 代替 CROSS APPLY (VALUES, 也可以做类似的事情: CROSS APPLY (SELECT DATEDIFF(MINUTE, CS.StartTime, SA.TodayFirstRunTime) as timing) x
猜你喜欢
  • 2023-03-20
  • 2017-09-06
  • 2023-03-11
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2011-02-09
相关资源
最近更新 更多