我有一个这样的查询:
选择"AVG([DC].[合同金额]( AS [平均合同金额] ,MAX([DC].[合同金额]( AS [最大合同金额] ,MIN([DC].[合同金额]( 作为 [最小合同金额] 来自 [设计客户] 作为 [DC] 内部连接 [设计] 作为 [DC] 上的 [D]。[设计键] = [D]。[设计键] 内部连接 [任务] 作为 [D] 上的 [T]。[设计键] = [t]。[设计键] 内部联接 [项目设计] 作为 [PD] 在 [D] 上。[设计键] = [PD]。[设计键] 内部联接 [项目] 作为 [PD] 上的 [P]。[项目键] = [P].[项目键] 内部联接 [地址] 在 [A] 上作为 [A]。[地址指导] = [P].[项目指南] 其中 [DC]。[合约金额] != 0.00 和 [DC]。[客户密钥] = @CustomerKey 或 [A]。[区域键] = @RegionKey 或 [A]。[状态键] = @StateKey
出于某种原因,当我执行它[MinContractedAmount]
返回0.00
值时,它不关心我的 where 子句[DC].[ContractedAmount] != 0.00
,为什么这不起作用?
注意[DC].[ContractedAmount]
是一个货币字段
您需要对WHERE
子句使用()
AND
因为运算符具有优先权,现在解释器可以理解这一点
WHERE ([DC].[ContractedAmount] != 0.00 AND [DC].[CustomerKey] = @CustomerKey)
OR [A].[RegionKey] = @RegionKey
OR [A].[StateKey] = @StateKey
你可能想要
WHERE [DC].[ContractedAmount] != 0.00
AND ( [DC].[CustomerKey] = @CustomerKey
OR [A].[RegionKey] = @RegionKey
OR [A].[StateKey] = @StateKey )
您需要了解AND
和OR
的工作原理。
仅当TRUE
所有相关条件时,才会AND
结果TRUE
OR
结果要TRUE
即使只有涉及的条件之一TRUE
这解释了您注意到您的某个条件被忽略的行为。
退货TRUE
:
condition1 = TRUE AND condition2 = TRUE
退货TRUE:
condition1 = FALSE AND condition2 = FALSE OR condition3 = TRUE
解决方案:使用括号对哪些条件进行分组,您只需要TRUE
1 个结果。
退货FALSE
:
(condition1 = TRUE OR condition2 = TRUE) AND condition3 = FALSE
如果我明白,你想要这个:
SELECT AVG(DC.ContractedAmount) AS AverageContractedAmount
,MAX(DC.ContractedAmount) AS MaxContractedAmount
,MIN(DC.ContractedAmount) AS MinContractedAmount
FROM DesignCustomer AS DC
WHERE DC.ContractedAmount <> 0 AND DC.CustomerKey = @CustomerKey
and exists
(
select *
from Design AS D
INNER JOIN Task AS T ON D.DesignKey = t.DesignKey
INNER JOIN ProjectDesign AS PD ON D.DesignKey = PD.DesignKey
INNER JOIN Project AS P ON PD.ProjectKey = P.ProjectKey
INNER JOIN Address AS A ON A.AddressGuid = P.ProjectGuid and (A.RegionKey = @RegionKey or A.StateKey = @StateKey)
where DC.DesignKey = D.DesignKey
)