如何在条件下正确使用AND/OR

Pep*_*epe 2 t-sql sql-server

我有一个查询像这样:

SELECT AVG([DC].[ContractedAmount]) AS [AverageContractedAmount]
      ,MAX([DC].[ContractedAmount]) AS [MaxContractedAmount]
      ,MIN([DC].[ContractedAmount]) AS [MinContractedAmount]
FROM [DesignCustomer] AS [DC]
INNER JOIN [Design] AS [D] ON [DC].[DesignKey] = [D].[DesignKey]
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]
WHERE [DC].[ContractedAmount] != 0.00
AND [DC].[CustomerKey] = @CustomerKey
OR [A].[RegionKey] = @RegionKey
OR [A].[StateKey] = @StateKey

出于某种原因,当我执行它[MinContractedAmount]返回0.00值时,它不关心我的where子句[DC].[ContractedAmount] != 0.00,为什么这不起作用?

注意[DC].[ContractedAmount]是金钱领域

Jua*_*eza 7

您需要使用()您的WHERE子句,因为AND运算符具有优先权,现在解释器理解这一点

WHERE ([DC].[ContractedAmount] != 0.00 AND [DC].[CustomerKey] = @CustomerKey)
 OR [A].[RegionKey] = @RegionKey
 OR [A].[StateKey] = @StateKey
Run Code Online (Sandbox Code Playgroud)

你可能想要

WHERE [DC].[ContractedAmount] != 0.00 
  AND ( [DC].[CustomerKey] = @CustomerKey
     OR [A].[RegionKey] = @RegionKey
     OR [A].[StateKey] = @StateKey )
Run Code Online (Sandbox Code Playgroud)