【发布时间】: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