【问题标题】:SQL query aggregate function in WHERE clauseWHERE 子句中的 SQL 查询聚合函数
【发布时间】:2016-10-25 06:40:38
【问题描述】:

我有一些关于 MSSQL 语句的问题。所以基本上这是我的 SQL 查询:

SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date
INNER JOIN table2
INNER JOIN table3
WHERE avg_date <= ALL
(SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date
INNER JOIN table2
INNER JOIN table3
GROUP BY table1.col1);

我想做的是在子查询中,我得到每个用户的平均日期组列表。返回的示例数据为 (userName, avg_date):

user1  10
user2  20
user3  20

然后在那之后,从外面的查询中,我需要找到从子查询返回的平均日期的最小值。但是,通过这样做,我收到了来自外部查询的错误消息,我只比较 1 列,而子查询返回 2 列。

错误信息是An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference

但是,在我的子查询中,我需要每个用户的 GROUP BY,所以我不能简单地 SELECT avg。

任何想法如何解决这个问题?

提前致谢。

【问题讨论】:

  • 错误信息是什么?
  • 错误信息是聚合可能不会出现在 WHERE 子句中,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且正在聚合的列是外部引用。我想做的是在子查询中,我得到每个用户的平均日组列表。然后在外部查询中,我得到了该列表中的最小值。任何想法如何实现这一目标?
  • 是的。但为简单起见,我将其删除。我什至重命名了列名,就好像我要使用我原来的表名一样,这会很混乱
  • 错误信息就是你的答案。你不能那样做;你需要找到不同的方法。也许是您内部查询的 CTE;或带有 WHERE 外部的简单子查询,或 ...
  • 尝试对派生数据使用 CROSS APPLY 而不是 JOIN。这是一种内联 CTE。

标签: sql-server sql-server-2008 select subquery


【解决方案1】:

试试这个

SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date
INNER JOIN table2
INNER JOIN table3
HAVING avg_date <= (SELECT avg_date from
(SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date
INNER JOIN table2
INNER JOIN table3
GROUP BY table1.col1)
);

替代方案:

SELECT * FROM
(
    SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date
    INNER JOIN table2
    INNER JOIN table3
) outer_table
WHERE avg_date <= ALL(SELECT avg_date from(SELECT table1.col1,avg(datediff(dd, table2.date, table3.date)) as avg_date
INNER JOIN table2
INNER JOIN table3
GROUP BY table1.col1));

为 SQL Server 编辑

SELECT * FROM
(
    SELECT table1.col1, avg(datediff(dd, table2.date, table3.date)) as avg_date
    INNER JOIN table2
    INNER JOIN table3
) outer_table
WHERE avg_date <= ALL(SELECT inner_table.avg_date from
(SELECT table1.col1,avg(datediff(dd, table2.date, table3.date)) as avg_date
INNER JOIN table2
INNER JOIN table3
GROUP BY table1.col1) inner_table);

【讨论】:

  • 抱歉,无法识别 avg_date 列。另外,第二个 select 语句的最后一个括号有语法错误
  • 你有什么想法吗?
  • 在外部查询中尝试“have” insted “where”。
  • 我已经更新了查询。此外,添加了替代查询。让我知道它是否适合您。
  • 抱歉,是不是有些支架放错了位置?错误在最后一个括号中突出显示,说 Execting ID 或 ASquoted_id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2010-09-28
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
相关资源
最近更新 更多