2016-10-25 4 views
0

У меня возникли вопросы относительно инструкции MSSQL. Таким образом, в основном это мой SQL-запрос:Функция агрегирования SQL-запросов в выражении WHERE

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 

Тогда после этого, из запроса извне, мне нужно найти минимум средней даты возвращенной из вспомогательного запроса. Однако, делая это, я получаю сообщение об ошибке и как сообщение извне, я сравниваю только один столбец, в котором подзапрос возвращает 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 каждого пользователя, так что я не могу просто выбрать ср.

Любые идеи, как исправить это?

Заранее спасибо.

+0

Что такое сообщение об ошибке? –

+0

Сообщение об ошибке. Агрегат может не отображаться в предложении WHERE, если он не находится в подзапросе, содержащемся в предложении HAVING или списке выбора, а агрегированный столбец является внешней ссылкой. То, что я пытаюсь сделать, находится внутри подзапроса, я получаю список группы среднего дня каждым пользователем. Затем во внешнем запросе я получаю минимум из этого списка. Любые идеи, как достичь этого? – hyperfkcb

+0

Да, это так. Но для простоты я удалил его. Я даже переименовал имя столбца, как если бы я использовал свое исходное имя таблицы, он будет очень запутанным. – hyperfkcb

ответ

2

Попробуйте

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)); 

Edited для 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); 
+0

Извините, но столбец avg_date не распознается. Кроме того, есть синтаксическая ошибка в последней скобке второго оператора select – hyperfkcb

+0

У вас есть идеи? – hyperfkcb

+0

Попробуйте ввести «где» во внешнем запросе. – Nitin

Смежные вопросы