sql-server – 在SQL中选择CASE与CASE
我不太明白为什么这两个不同的代码示例会返回不同的值.
某种程度上不正确但工作语法,返回错误结果,例如,当比较两个相等的值时,它返回0: (SELECT CASE WHEN SUM(V.IsCompatible) OVER (PARTITION BY ComputerName,UserID) = ApplicationCount THEN 1 ELSE 0 END ) AS CompatibleUser 下面的那个返回正确的值,即. 1当有两个相等的值进行比较时. (CASE WHEN SUM(V.IsCompatible) OVER (PARTITION BY ComputerName,UserID) = ApplicationCount THEN 1 ELSE 0 END ) AS CompatibleUser 甚至更简单: (SELECT CASE WHEN X = Y THEN 1 ELSE 0 END ) AS Result X = 22且Y = 22 =>结果= 0 (CASE WHEN X = Y THEN 1 ELSE 0 END ) AS Result X = 22且Y = 22 =>结果= 1 我理解应用正确的语法很重要,我知道T-SQL中的SELECT CASE语法,但我不明白如何评估第一个代码示例并提供意外结果. 更新:在其上下文中的完整查询 select userapplication.username,computerdetails.computername,sum(userapplication.iscompatible) over (partition by computerdetails.computername,userapplication.userid) as compatiblecount,userapplication.applicationcount,( case when sum(userapplication.iscompatible) over (partition by computerdetails.computername,userapplication.userid) <> userapplication.applicationcount then 0 else 1 end ) as usercomputeriscompatible from computerdetails right outer join usercomputer on computerdetails.computerid = usercomputer.computerid right outer join userapplication on usercomputer.gebruikerid = userapplication.userid 所以userComputerIsCompatible是这里的问题 解决方法我认为这种行为的原因是下一个:像(SELECT …)这样的表达式被认为是子查询,即使它们没有FROM子句.假设这些(错误)“子查询”的数据源仅是当前行.因此,(SELECT表达式)被解释为(SELECT表达式FROM current_row)和(SELECT SUM(iscompatible)OVER(…))被执行为(SELECT SUM(iscompatible)OVER(current_row)).参数:分析(SELECT SUM(IsWeb)OVER(PARTITION BY OrderDate)[FROM current_row])表达式的执行计划 在Segment和Stream Aggregate([Expr1007] =标量运算符(SUM(@OrderHeader.[IsWeb]为[h].[IsWeb])))运算符之前,我看到一个 示例(使用SQL2005SP3和SQL2008测试): DECLARE @OrderHeader TABLE ( OrderHeaderID INT IDENTITY PRIMARY KEY,OrderDate DATETIME NOT NULL,IsWeb TINYINT NOT NULL --or BIT ); INSERT @OrderHeader SELECT '20110101',0 UNION ALL SELECT '20110101',1 UNION ALL SELECT '20110101',1 UNION ALL SELECT '20110102',1 UNION ALL SELECT '20110103',0 UNION ALL SELECT '20110103',0; SELECT *,SUM(IsWeb) OVER(PARTITION BY OrderDate) SumExpression_1 FROM @OrderHeader h ORDER BY h.OrderDate; SELECT *,(SELECT SUM(IsWeb) OVER(PARTITION BY OrderDate)) SumWithSubquery_2 FROM @OrderHeader h ORDER BY h.OrderDate; 结果: OrderHeaderID OrderDate IsWeb SumExpression_1 ------------- ----------------------- ----- --------------- 1 2011-01-01 00:00:00.000 0 2 2 2011-01-01 00:00:00.000 1 2 3 2011-01-01 00:00:00.000 1 2 4 2011-01-02 00:00:00.000 1 1 5 2011-01-03 00:00:00.000 0 0 6 2011-01-03 00:00:00.000 0 0 OrderHeaderID OrderDate IsWeb SumWithSubquery_2 ------------- ----------------------- ----- ----------------- 1 2011-01-01 00:00:00.000 0 0 2 2011-01-01 00:00:00.000 1 1 3 2011-01-01 00:00:00.000 1 1 4 2011-01-02 00:00:00.000 1 1 5 2011-01-03 00:00:00.000 0 0 6 2011-01-03 00:00:00.000 0 0 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |