【问题标题】:Unexcpected NULL result with SELECT CASE statementSELECT CASE 语句的意外 NULL 结果
【发布时间】:2015-10-02 03:44:38
【问题描述】:

以下是我的查询:

DECLARE
    @ThisYear INT = CAST(DATEPART(yy, GETDATE()) AS INT) 
    ,@LastYear INT = CAST(DATEPART(yy, GETDATE()) - 1 AS INT)

SELECT
    CASE WHEN CAST(DATEPART(yy, mq.[qDate]) AS INT)   = @ThisYear THEN 5
            WHEN CAST(DATEPART(yy, mq.[qDate]) - 1 AS INT) = @LastYear THEN 6 END AS 'TimePeriodID'
    ,Name = 'QueryTotals'
    ,SUM(CASE WHEN dQuery = 1 THEN 1 ELSE 0 END) AS 'DefaultQuery'
    ,SUM(CASE WHEN dQuery = 0 THEN 1 ELSE 0 END) AS 'Non-DefaultQuery'
    ,COUNT(dQuery) AS 'TotalQueries'
FROM 
    mQuery mq
INNER JOIN 
    mParameter mp
    ON
    mq.id = mp.id
INNER JOIN 
    Variable v
    ON
    mp.id = v.id
WHERE 
    v.id <= 10
GROUP BY
    CASE WHEN CAST(DATEPART(yy, mq.[qDate]) AS INT)   = @ThisYear THEN 5
            WHEN CAST(DATEPART(yy, mq.[qDate]) - 1 AS INT) = @LastYear THEN 6 END

以下是我的结果截图:

请忽略带有TimePeriodID = 1, 2, 3, 4 的行,因为这些行是UNIONed 到相关查询中的。

为什么我在 TimePeriodID 中得到一个 NULL 而应该是 6

请注意,结果总数是正确的,并且表格中有日期满足条件为6

我对此感到茫然。

额外的眼睛会很棒。

谢谢。

【问题讨论】:

    标签: sql-server case aggregate-functions


    【解决方案1】:

    这些语句的组合:

    DECLARE
        @ThisYear INT = CAST(DATEPART(yy, GETDATE()) AS INT) 
        ,@LastYear INT = CAST(DATEPART(yy, GETDATE()) - 1 AS INT)
    
    SELECT
        CASE WHEN CAST(DATEPART(yy, mq.[qDate]) AS INT)   = @ThisYear THEN 5
                WHEN CAST(DATEPART(yy, mq.[qDate]) - 1 AS INT) = @LastYear THEN 6 END AS 'TimePeriodID'
    

    使得第二种情况永远不可能是真的。如果第一个演员表 != @ThisYear,那么第二个演员表(即 1st - 1)不能是 == @LastYear,因为 @LastYear = @ThisYear - 1。

    所以这就是原因。解决方案尚不清楚,因为您没有展示您要做什么。

    【讨论】:

    • 谢谢先生!这让我发疯了。更改为:CASE YEAR(mq.[qDate]) WHEN @ThisYear THEN 5 WHEN @LastYear THEN 6 END AS 'TimePeriodID' 并且有效。我知道这是基本的东西。
    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2013-03-23
    • 2014-12-05
    相关资源
    最近更新 更多