sql-server - 使用多列的 Group by 和 Have 子句
问题描述
AND
以下子句中的条件的行为Having
就像它过滤行一样,即使在它应该是逻辑AND
行为时满足其中一个条件也是如此。
with cte as
( select 'A' as name , 10 as Classes , 11 as Fees union all
select 'A' as name , 10 as Classes , 10 as Fees union all
select 'A' as name , 10 as Classes , 10 as Fees union all
select 'A' as name , 10 as Classes , 10 as Fees union all
select 'A' as name , 10 as Classes , 10 as Fees union all
select 'B' as name , 0 as Classes , 10 as Fees union all
select 'B' as name , 0 as Classes , 10 as Fees union all
select 'B' as name , 1 as Classes , 10 as Fees union all
select 'B' as name , -10 as Classes , 10 as Fees union all
select 'B' as name , 10 as Classes , 11 as Fees
)
-- A has 50 rooms and 51 $ -- so it should not be returned
-- B has 1 room and 51 $ and should be fetched
-- why would the AND in the having clause behave like a row level filter on only the indivigual column
-- instead of the combination
-- The weird thing is the logic behaves as expected when using = but fails when using <>
select name , sum(Classes) , sUM(Fees)
from cte
group by name
having ( SUM(Classes) !=50) AND (sum(Fees) !=51 )
这是奇怪的部分,如果您将 != 替换为如下所示的 =,那么它可以正常工作
with cte as
( select 'A' as name , 10 as Classes , 11 as Fees union all
select 'A' as name , 10 as Classes , 10 as Fees union all
select 'A' as name , 10 as Classes , 10 as Fees union all
select 'A' as name , 10 as Classes , 10 as Fees union all
select 'A' as name , 10 as Classes , 10 as Fees union all
select 'B' as name , 0 as Classes , 10 as Fees union all
select 'B' as name , 0 as Classes , 10 as Fees union all
select 'B' as name , 1 as Classes , 10 as Fees union all
select 'B' as name , -10 as Classes , 10 as Fees union all
select 'B' as name , 10 as Classes , 11 as Fees
)
-- A has 50 rooms and 51 $ -- so it should not be returned
-- B has 1 room and 51 $ and should be fetched
-- why would the AND in the having clause behave like a row level filter on only the indivigual column
-- instead of the combination
-- The weird thing is the logic behaves as expected when using = but fails when using <>
select name , sum(Classes) , sUM(Fees)
from cte
group by name
having ( SUM(Classes) =1) AND (sum(Fees) =51 )
当谈到工作方式时,我是否遗漏了什么Group by
?我知道我可以解决这个问题,但我不明白为什么它会这样。
这就是我得到的
这是我应该得到的
解决方案
经过一番讨论,尝试使用这个
having not(SUM(Classes) =50 AND sum(Fees) =51)
和 OP,当你写布尔值时,你必须三思而后行。
推荐阅读
- python - 关于如何索引 pandas 数据帧以及我应该如何更改代码以避免它的警告是什么
- node.js - 405 不允许在生产中使用
- vba - 将一个单元格除以另一个单元格时出现VBA溢出错误
- python - 如何检查按钮是否有效
- java - Pentaho Data Integration v9.2 在存储库探索时崩溃(Mac OS BigSur)
- html - 将行数据获取到引导模式
- php - Laravel 在反向代理设置中的 POST 请求中不断返回“419 Page Expired”
- business-objects - SAP WEBI - 比较多个维度时业务对象获取最小值
- chainlink - Chainlink 节点设置错误:ChainID 与本地链 ID 不匹配
- c++ - 文字中的通用字符名称?