SQL Server无法对包含聚合或子查询的表达式执行聚合函数

时间:2016-04-26 13:56:53

标签: sql sql-server tsql

我的存储过程存在问题。

我收到错误:

  

无法对包含的表达式执行聚合函数   聚合或子查询

这是我的存储过程中我认为发生错误的部分:

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 

谢谢。

3 个答案:

答案 0 :(得分:6)

如果你试图避免相关的子查询,你通常会获得更好的性能:

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表中最多只有一个匹配(产品,而不是Table_Products - 当然它是一个表,所以不要把它放在名称中)。换句话说,如果product是Products表的PK(或AK),这将起作用。

如果情况并非如此,并且您可能在Products表格中有多个匹配项,那么您可以JOIN使用DISTINCT product上的{{1}} }专栏。

答案 1 :(得分:2)

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 

答案 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 ;