2016-04-26 39 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'是'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 

這假定會有永遠只能是在產品表(產品,而不是Table_Products最多一個比賽 - 當然這是一張桌子,所以不要把它放在名字裏)。換句話說,如果產品是產品表的PK(或AK),這將起作用。

如果不是這種情況,你可能有多個匹配的Products,這時你可以JOIN到上product列使用DISTINCT子查詢。

+0

這使得'Product'在任一表中都不會重複。 –

+0

這只是一個問題,如果它在產品表中重複 - 我在我的答案中明確指出,甚至描述了該案例的解決方法。 –

+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 ; 
相關問題