我如何 Select 来自临时 table 的聚合函数,而不会因未在 GROUP BY 子句中包含该列而出现无效列错误?

How do I Select an aggregate function from a temp table without getting the invalid column error from not including the column in the GROUP BY clause?

我在 temp table 中执行了聚合函数,但出现错误,因为我执行聚合函数的字段未包含在 table 中的 GROUP BY I我从中选择。澄清一下,这只是一个片段,因此这些 table 是较大查询中的临时 table。它们在实际代码中也被命名。

WITH #t1 AS
(SELECT
  Name,
  Date,
  COUNT(Email),
  COUNT(DISTINCT Email)
FROM SentEmails)
SELECT
  #t1.*,
  #t2.GrossSents
FROM #t1
--***JOINS***
GROUP BY
  #t1.Name,
  #t1.Date

我希望 table 具有 NameDateCount of EmailsUnique EmailsGross Sends 字段,但我得到

Column '#t1.COUNT(Email)' is invalid in the select list` because it is not contained in either an aggregate function or the GROUP BY clause.

将您的问题分成几个步骤。

首先让 CTE 中的查询到 return 您期望从中得到的数据。此处编写的查询不会 运行 因为您在没有 GROUP BY 子句的情况下进行聚合。

一旦该查询为您提供了您想要的结果,将其包装在 CTE 语法中并尝试 SELECT * FROM cteName 以查看是否有效。你会在这里得到一个错误,因为 CTE 中的每一列都必须有一个名称,而你的最后两列没有名称。此外,如评论中所述,将 CTE 命名为 # 是一种不良做法。它使后续代码更加混乱,因为它看起来好像某个地方有临时 table,但实际上没有。

在您拥有 CTE return 所需内容后,开始加入其他 table,一次一个。在您添加 table 时监控这些结果,以确保您的 JOIN 正在按预期工作。

如果您要对外部查询进行进一步聚合,指定 SELECT * 只是自找麻烦,因为无论如何您都需要指定 GROUP BY 中的每个非聚合列.作为一般规则,您应该在 SELECT 中枚举您的列,在这种情况下,您可以将它们复制并粘贴到最终的 GROUP BY 中。