2016-04-26 131 views
1

ストアドプロシージャに問題があります。SQL Server集計またはサブクエリを含む式で集計関数を実行できません

私はエラーを取得しています:

Cannot perform an aggregate function on an expression containing an aggregate or a subquery

は、ここで私は、エラーが発生したと考えている私のストアドプロシージャの一部です:

SELECT column_1, column_2, 
     SUM(CASE WHEN column_2 NOT IN (SELECT product FROM table_products) THEN 1 
       ELSE 0 
      END) AS Total 
FROM my_table 
WHERE is_rated = '1' 
GROUP BY column_1, column_2 

ありがとうございました。とにかく相関サブクエリを回避しよう場合は、一般的にはるかに優れたパフォーマンスを得られます

+0

私はこのクエリは、あなたがそれを行うことを期待しないと思います。これは、 'table_products'の中の#productを返すか、数値より少ないものを返します(' product'が 'NULL'でもあるなら' 0')。サンプルデータと希望する結果で別の質問をすることもできます。 –

答えて

4

SELECT 
    MT.column_1, 
    MT.column_2, 
    SUM(CASE WHEN P.product IS NULL THEN 1 ELSE 0 END) AS total 
FROM 
    My_Table MT 
LEFT OUTER JOIN Products P ON P.product = MT.column_2 
WHERE 
    MT.is_rated = '1' 
GROUP BY 
    MT.column_1, 
    MT.column_2 

をこれは今までProductsテーブル内で最も1試合(製品、ないTable_Productsがあることを前提として - もちろんそれはテーブルなので、名前に入れないでください)。つまり、商品が商品表のPK(またはAK)である場合、これは機能します。

それはそうではないですし、あなたがProductsテーブルに複数の一致があるかもしれないなら、することができますproduct列にDISTINCTを使用してサブクエリへJOIN

+0

これは、どちらのテーブルでも 'Product'が決して繰り返されないという前提を作り出しています。 –

+0

これはProductsテーブルで繰り返されている場合にのみ問題になります。これは私の答えで明示的に指摘し、そのケースの回避策についても説明しました。 –

+0

。 。私はそれが 'My_Table'でも繰り返されれば問題だと思いますが、それはOPが望む実際の結果に依存します。 –

1
SELECT 
    column_1, column_2, 
    SUM(
     CASE 
     WHEN table_products.product IS NULL THEN 1 
     ELSE 0 
     END 
    ) AS Total 
FROM my_table 
left join table_products on my_table.column_2 = table_products.product 
WHERE is_rated = '1' 
GROUP BY column_1, column_2 
0

あなたは、サブクエリ内SUM()ロジックを移動することができます。

SELECT t.column_1, t.column_2, 
     (SELECT COUNT(*) 
     FROM table_products p 
     WHERE t.column_2 <> p.product 
     ) as Total 
FROM my_table t 
WHERE t.is_rated = '1' 
GROUP BY t.column_1, t.column_2 ; 
関連する問題