【问题标题】:Can't refer to column counting the ocurrences不能参考计数出现的列
【发布时间】:2015-09-09 11:34:16
【问题描述】:

我创建了以下查询来计算表中 ID 的重复次数。

select count(Hazaa) as Countie from Shazoo
group by Hazaa

意识到它们中的大多数都等于 1(应该如此),我添加了条件以仅显示错误的条件。但是,SQL Server 在语法上不同意我的观点。

select count(Hazaa) as Countie from Shazoo
where Countie > 1
group by Hazaa

我如何区分结果的数量?

【问题讨论】:

标签: sql-server


【解决方案1】:

GROUP BY的过滤结果需要使用HAVING

SELECT Hazaa, COUNT(Hazaa) AS Countie
FROM Shazoo
GROUP BY Hazaa
HAVING COUNT(Hazaa) > 1

或将其包装在子查询/CTE 中并使用WHERE 过滤:

;WITH cte AS (
   SELECT Hazaa, COUNT(Hazaa) AS Countie
   FROM Shazoo
   GROUP BY Hazaa
)
SELECT *
FROM cte
WHERE Countie > 1;

simplified order of execution

读取简化图像,例如:首先从源获取数据,然后使用WHERE 过滤,然后使用GROUP BY,然后使用HAVING 过滤组结果,最后使用SELECT 获取/项目列。

您也可以这样想,WHERE/HAVING 将过滤您的行,但使用 SELECT 您将限制列,例如:SELECT * FROM tab 提供所有列,SELECT id FROM tab 仅提供一个。

Logical query processing

【讨论】:

  • 我认为 HAVING() 比 CTE 之类的解决方法更好地发挥作用
  • @Eric 这只是为了向作者表明WHERE 也可以工作。当然HAVING 在这里是非常优越的。
  • @Eric 我还要说,如果聚合条件不仅仅是简单的(例如 sum(case when...),CTE 的一个优势在于您不必复制一遍又一遍的长字符串。在某些情况下更容易阅读。
  • 这是正确的但是我只能给它+1,这waaay太少了。图像太棒了。 (我希望你已经有了。否则,你似乎有太多的空闲时间,哈哈哈。谢谢!) 但是,我想知道为什么 select 小于提供它的条件。 可以限制被选择的集合吗?
  • @KonradViltersten 此图像可能具有误导性。我的意思是 SELECT 是执行时的最后一个操作之一(但是当您编写查询时它是第一个)。如果你知道LINQ你会看到更多的自然秩序from where selectthis poster
猜你喜欢
  • 2011-05-04
  • 2021-07-30
  • 2023-04-02
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多