SELECT CASE 语句的意外 NULL 结果
Unexcpected NULL result with SELECT CASE statement
以下是我的查询:
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
的行,因为这些行已 UNION
编辑到相关查询中。
为什么我在 TimePeriodID 中得到 NULL
而它应该是 6
?
请注意,结果总计是正确的,并且 table 中的日期满足条件 6
。
我对此一头雾水
再多一只眼睛就好了。
谢谢。
这样的组合语句:
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,那么第二个演员(即第一个 - 1)不能 == @LastYear,因为 @LastYear = @ThisYear - 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'
,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
的行,因为这些行已 UNION
编辑到相关查询中。
为什么我在 TimePeriodID 中得到 NULL
而它应该是 6
?
请注意,结果总计是正确的,并且 table 中的日期满足条件 6
。
我对此一头雾水
再多一只眼睛就好了。
谢谢。
这样的组合语句:
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,那么第二个演员(即第一个 - 1)不能 == @LastYear,因为 @LastYear = @ThisYear - 1.
原来如此。解决方案不清楚,因为您没有展示您要做什么。