【问题标题】:SQL Server: COUNT used with WHERESQL Server:COUNT 与 WHERE 一起使用
【发布时间】:2017-12-01 16:19:05
【问题描述】:

所以我认为自己对 SQL Server 非常陌生,所以使用较少的关键字,如 HAVINGCOUNT() 等。所以当我收到此错误时:

聚合可能不会出现在 WHERE 子句中,除非它位于 包含在 HAVING 子句或选择列表中的子查询,以及列 被聚合是一个外部引用。

最后一点我真的很困惑。 “选择列表?” “正在聚合的列是外部引用?”谁能通俗的解释一下?

【问题讨论】:

  • 您能发布您的查询吗?选择列表只是通常与 IN 一起使用的子查询,即 WHERE STATE in (select state from sometable)
  • 我刚刚使用COUNTWHERE 进行了查询,以查看错误消息并更好地理解COUNT 及其局限性。没有我试图解决的具体问题。我只是不明白这个消息。

标签: sql-server count aggregate where having


【解决方案1】:

这基本上是说如果你想在这些地方使用聚合,你需要使用引用另一个表的子查询:

SELECT A,
       B,
       C
FROM Table T
WHERE A = (SELECT MAX(D) FROM Table T2 WHERE T2.A = T.A) 
          --Valid, MAX(D) is an outer reference to another table we call T2

SELECT A,
       B,
       C
FROM Table T
WHERE A = MAX(D) --Invalid

HAVING 版本是这样的:

SELECT A,
       B,
       C
FROM Table T
GROUP BY A,
         B,
         C
HAVING COUNT(*) > (SELECT MAX(D) FROM Table T2) --Valid

SELECT A,
       B,
       C
FROM Table T
GROUP BY A,
         B,
         C
HAVING COUNT(*) > MAX(D) --Invalid

【讨论】:

    【解决方案2】:

    SELECT 列表是

    SELECT a, b, c ...    <=== this list of expressions after SELECT
    

    外部引用是子查询中引用的周围查询的列。这里有清楚的解释:Aggregates with an Outer Reference

    请注意,WHERE 子句应用于分组(使用 GROUP BY)和 HAVING 子句分组之后。因此,聚合函数可以出现在 HAVING 子句中,但不能出现在 WHERE 子句中。

    SELECT customer_id, COUNT(*) as number_of_orders, SUM(amount) AS total_amount
    FROM cust_orders
    WHERE year(order_date) = 2017      -- filters records before grouping.
    GROUP BY customer_id               -- groups while counting and summing up.
    HAVING COUNT(*) > 2                -- count is available here.
    

    这会选择 2017 年的所有客户订单并计算每个客户的总数。只有今年订单超过 2 个的客户才会被退回。

    【讨论】:

      【解决方案3】:

      基本上它说的是你不能这样做:

      WHERE COUNT(ColumnA) = 100 
      

      GROUP BY 后面需要一个HAVING

      SELECT COUNT(ColumnA) AS CountA, ColumnB, ColumnC
      FROM Table
      GROUP BY ColumnB, ColumnC
      HAVING COUNT(ColumnA) = 100
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-15
        • 2011-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        相关资源
        最近更新 更多