首页 > 解决方案 > SQL-SERVER - CASE 错误 - 特定源中的 CASE 不起作用

问题描述

我正在处理一个我想要一整个月的平均温度的查询,但我有一个挑战。当新的一年开始时,月份是 1,我不能使用命令:

MONTH(TimestampUTC) = MONTH(DATEADD(MONTH, -1, GETDATE()))

因为第 1 个月减去 1 是第 0 个月。

因此,我不想使用 case 表达式来使我的代码正常工作。

当我运行下面的查询时,我收到以下错误:

消息 156,第 15 级,状态 1,第 6 行

关键字“CASE”附近的语法不正确。

当然,我希望以下查询起作用。有人能帮我吗?

SELECT AVG(Value) AS AVG_temp 
FROM(

SELECT Value, TimestampUTC  
WHERE SourceName = 'Buitentemperatuur' 
CASE 
    WHEN MONTH(TimestampUTC) = 1 
    THEN MONTH(TimestampUTC) = MONTH(DATEADD(MONTH, +11, GETDATE()))
        and YEAR(TimestampUTC) = YEAR(DATEADD(YEAR, -1, GETDATE()))
    ELSE
        MONTH(TimestampUTC) = MONTH(DATEADD(MONTH, -1, GETDATE()))
        and YEAR(TimestampUTC) = YEAR(DATEADD(YEAR, 0, GETDATE()))
END 
FROM vDataLogChannelValue
) x

我工作的程序是 Microsoft SQL Server Management Studio 2014。我已经对代码的其他部分进行了一些 UNIT 测试。当我添加 CASE 时,错误会激活并且代码不再起作用。

更新:

感谢您对它现在起作用的响应,但是现在我有以下警告,这对我来说没有意义,因为它在我不在此查询中时测试它时起作用:

消息 102,第 15 级,状态 1,第 8 行

'=' 附近的语法不正确。

这是关于以下行:

THEN MONTH(TimestampUTC) = MONTH(DATEADD(MONTH, +11, GETDATE()))

标签: sql-serversyntax-errorcase

解决方案


您必须在第一个子句AND之后有一个关键字。WHERE然后您将不得不构建另一个WHERE使用该CASE语句的子句。除此之外,现在应该在THEN子句中进行分配。

下面是一个可以在语法方面起作用的示例:

SELECT Value, TimestampUTC  
WHERE SourceName = 'Buitentemperatuur' AND SomethingElse =
CASE 
    WHEN MONTH(TimestampUTC) = 1 
    THEN 123
    ELSE
        234
END 
FROM vDataLogChannelValue
) x

推荐阅读