2013-04-30 5 views
0

В настоящее время я пытаюсь использовать вложенный подзапрос для фильтрации строк на каждом уровне вложенного цикла. Причина, по которой я делаю это, - это то, что запросы выполняются пользователем на уровне приложения, и порядок фильтров создается ими.Проблема с вложенным запросом SQL Server

Вот пример запроса, который может быть создан с помощью интерфейса:

SELECT AVG(value) As Average, STDEV(value) As Standard_Deviation, DATEPART(mm,date) As Month 
FROM sqlTable 
WHERE value IN 
    (SELECT TOP 2000 STDEV(value) FROM sqlTable WHERE value IN 
     (SELECT TOP 10000 AVG(value) FROM sqlTable ORDER BY AVG(value)) 
    ORDER BY STDEV(value) Desc) 
GROUP BY name_column1, name_column2, DATEPART(mm, Date); 

Существует только одна таблица sqlTable и только соответствующие столбцы value, column1, column2 и date.

Если пользователь решит, что они могут перемещать функцию STDEV выше в иерархии. Итак, строки сначала фильтруются STDEV (или перемещаются в самый дальний вложенный запрос). Этот запрос в настоящее время не возвращает никаких результатов, и когда я добавляю value к выбору вложенных запросов, я получаю сообщение об ошибке, поскольку это недопустимый столбец.

Ошибки:

is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS. 

Любая помощь очень ценится. Спасибо!

EDIT: фильтрация на одной таблице с миллионами записей для финансового проекта и позволяет увидеть пользователь, какие товары (column_name1 и column_name2) были наиболее выгодными и наименее рискованным (среди других функций) , Причина, по которой я использую вложенные запросы, заключается в том, что получение TOP 10000 на основе AVG, а затем выход из этого результата, возвращающего верхний 2000 на основе STDEV, отличается от того, что TOP 10000 основан на STDEV и возвращает TOP 2000 из этого на основе AVG. Я хочу, чтобы у пользователя была возможность заказать расчет, как бы они ни желали, и с более вложенными запросами, чем только это.

SELECT AVG(value) As Average, STDEV(value) As Standard_Deviation, DATEPART(mm,Date) As Month 
FROM sqlTable 
WHERE value IN 
    (SELECT TOP 2000 STDEV(value) FROM sqlTable WHERE value IN 
     (SELECT TOP 10000 column_name1, column_name2, value, AVG(value) FROM sqlTable 
     GROUP BY column_name1, column_name2, value ORDER BY AVG(value)) 
    GROUP BY column_name1, column_name2, value 
    ORDER BY STDEV(value)) 
GROUP BY column_name1, column_name2, DATEPART(mm, Date); 

возвращает вторую ошибку выше.

+0

Вы понимаете, что такое функции «AVG» и «STDEV» ?. Они являются функциями агрегации, а это означает, что если нет 'GROUP BY', вы вычисляете одно значение для всей таблицы. Таким образом, «ТОП 10000» и «ЗАКАЗАТЬ» не имеют никакого смысла. – Lamak

+0

Благодарим вас за комментарий. Я отредактировал мой ответ выше, чтобы включить предложение GROUP BY, но я все еще получаю ошибки, о которых я упоминал ранее, только с 1 выражением. –

ответ

2

При использовании GROUP BY каждый столбец в предложении SELECT должны быть либо определены с помощью агрегатной функции (например, MAX, MIN, AVG, ...) или должны быть включены в п GROUP BY.

+0

Благодарим вас за быстрый ответ. Можно ли возвращать несколько столбцов во вложенный запрос? –

1

Запрос в вас in заявление не имеет смысла:

WHERE value IN 
    (SELECT TOP 2000 STDEV(value) FROM sqlTable WHERE value IN 
     (SELECT TOP 10000 AVG(value) FROM sqlTable ORDER BY AVG(value)) 
    ORDER BY STDEV(value) Desc) 

Выражение использует агрегатную функцию (stdev()), но там нет соответствующего group by. Таким образом, это вернет только одну строку. top 2000 не нужен.

Возможно, вы ожидаете получить stdev() с внешнего group by. Но это не работает. where обрабатывается до group by. Если вы хотите получить последующие результаты, то вам понадобится предложение having. Но предложение having не могло сравниться с value.

Я предлагаю вам задать другой вопрос, который объясняет, что делает фильтрация и вложение. Как написано, я не вижу конкретного использования для этого запроса. Весьма маловероятно, что значение будет в списке стандартных отклонений.Даже если значения были действительно, очень близки, минимальная численная разница сохранила бы работу in.

+0

+1 Я добавил редактирование к моему оригинальному вопросу. Спасибо за помощь! –

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