表达式上的聚合函数错误

时间:2014-07-28 13:12:06

标签: sql-server tsql

此查询可能有什么问题:

SELECT 
   SUM(CASE 
          WHEN (SELECT TOP 1 ISNULL(StartDate,'01-01-1900') 
                FROM TestingTable  
                ORDER BY StartDate Asc) <> '01-01-1900' THEN 1 ELSE 0 END) AS Testingvalue.

得到错误:

  

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

2 个答案:

答案 0 :(得分:1)

正如koppinjo所述,您当前(已损坏)的查询正在检查您的表格中是否有NULL - 值(或StartDate = '01-01-1900'),请返回10取决于哪个,然后尝试SUM该单个值。

您需要两种不同的逻辑事物。 获取具有StartDate的行数或检查是否缺少任何行StartDate

SELECT --Checking if there is a NULL-value in table
(
  CASE WHEN 
    (SELECT TOP 1 ISNULL(StartDate,'01-01-1900')
    FROM TestingTable  
    ORDER BY StartDate Asc) <> '01-01-1900' THEN 1 
  ELSE 0 
  END
) AS TestingValue 


SELECT SUM(TestingValue) TestingValue --Give the count of how many non-NULLs there is
FROM
(
SELECT 
CASE WHEN 
  ISNULL(StartDate,'01-01-1900') <> '01-01-1900' THEN 1 
  ELSE 0 
END AS TestingValue
FROM TestingTable  
) T

这是SQL Fiddle并排显示两个输出。

答案 1 :(得分:0)

很难说,但你可能想要这样的东西:

SELECT 
   SUM(TestingValue)
   FROM 
    (SELECT 
        CASE
            WHEN ISNULL(StartDate,'01-01-1900') <> '01-01-1900' 
                THEN 1 
            ELSE 0 
        END AS TestingValue
     FROM  TestingTable) t

由于您的原始查询现在已经写入,您的子查询将总返回1个值,因此您的总和将始终为1或0,更不用说它是非法的。为了解决这个问题,这个SQL会将case语句应用于TestingTable中的每一行,并将结果插入到派生表(t)中,然后将&#39;外部&#39;选择将对结果求和。希望这有帮助!