0

現在、ネストされたサブクエリを使用して、ネストされたループの各レイヤーで行をフィルタリングしようとしています。私がこれを行っている理由は、クエリがアプリケーション レベルでユーザーによって作成され、フィルターの順序がそれらによって構築されるためです。

インターフェイスを使用して作成できるクエリの例を次に示します。

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

テーブルは 1 つsqlTableだけで、関連する列はvaluecolumn1column2、およびのみ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.

どんな助けでも大歓迎です。ありがとうございました!

編集: フィルタリングは、金融プロジェクトの何百万ものレコードを含む単一のテーブルで行われ、ユーザーはどの商品 (column_name1 と column_name2) が最も収益性が高く、リスクが最も低いか (他の関数の中でも) を確認できます。ネストされたクエリを使用している理由は、AVG に基づいて TOP 10000 を取得し、その結果から STDEV に基づいて上位 2000 を返すことと、STDEV に基づいて TOP 10000 を取得し、それに基づいて TOP 2000 を返すことは異なるためです。平均。私は、ユーザーが希望する方法で計算を順序付けできるようにし、これよりも多くのネストされたクエリを使用できるようにしたいと考えています。

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

上記の 2 番目のエラーを返します。

4

2 に答える 2

2

を使用する場合、句GROUP BYの各列はSELECT、集計関数 ( MAXMINAVGなど) を使用して定義するか、句に含める必要がありますGROUP BY

于 2013-04-30T15:49:43.197 に答える