【问题标题】:SQL Error of Cannot perform an aggregate function on an expression containing an aggregate or a subquery无法对包含聚合或子查询的表达式执行聚合函数的 SQL 错误
【发布时间】:2016-04-21 18:42:57
【问题描述】:

我在 SQL 中执行此查询,但出现类似“无法对包含聚合或子查询的表达式执行聚合函数”的错误。有没有人可以帮助我。我真的被困住了。谢谢 这是我的查询。

SELECT [id]
      ,[name]
      ,SUM(case 
           when [code] = 1  Then 
           case 
             when exists(select * from [sampletab] where [id] = [id]and [code] = 2) then

                case when exists(select * from [sampletab] where [id] = [id] and [code] = 4) then 100 
                else 100
                end 

               else 100
               end    
           when [code] = 8 then 200
           when code = 2 then 100
           when code = 4 then 100

      end
      ) as "totl"

  FROM [test].[dbo].[sampletab]
  GROUP BY id , name

My data

【问题讨论】:

  • [id] = [id] 表明您的查询不会做任何有用的事情。从样本数据和期望的结果开始怎么样?
  • 您好,感谢您的回复。实际上,我想计算一些值,例如如果客户的 id = 1 并且他的代码为 1、2、4,那么它必须计算一次。我正在尝试附上我得到的示例数据的屏幕截图,但不知道如何在此处添加屏幕截图。

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

这是您的查询的一个版本,实际上应该会得到一些结果。

SELECT
Id,
Name,
SUM(ScorePerCode)
FROM (
    SELECT 
    id,
    name,
    CASE WHEN code = 1 THEN 100
        WHEN code = 2 THEN 50
        WHEN code = 4 THEN 20
        WHEN code = 8 THEN 200
        END AS ScorePerCode
    FROM [test].[dbo].[sampletab]
) X
GROUP BY Id, Name

您查询的这一部分毫无意义,是您问题的根源。如果这个查询有机会工作的话,你总是会得到 100 的值...

 WHEN [code] = 1
         THEN 
            CASE WHEN EXISTS ( SELECT * FROM [sampletab] WHERE [code] = 2 ) 
            THEN 
                CASE WHEN EXISTS ( SELECT * FROM [sampletab] WHERE [code] = 4) 
                THEN 100
                ELSE 100 END 
            ELSE 100 END

【讨论】:

  • 嗨,请看一下我的数据截图。我实际上想对值求和。我需要首先根据 id 对所有记录进行分组。现在,如果一个客户有 1, 2, 4 所有这些代码,那么其对应的值 100 应该只计算一次,在其他情况下,如果他只有来自 (1,2,4) 的 1 个代码,那么他将再次获得 100需要计算的点。现在有意义吗?
  • 我仍然不是 100% 清楚,但我猜我上面答案中的第一个查询就是你想要的......
  • 正如您在我附加的示例数据截图中看到的那样,有一个 id =1 ,name = ali 的客户,但他有四个不同的代码,我想给他 100 分,即使他三个点(1, 2,4)只有一次,代码 8 有 200 分。所以对于 ali 来说,总共是 300。我不想给他 100 的代码 = 1 和另一个 100 的代码 = 2。我只想给他所有三个代码(1、2、4)和 200 分代码 = 8 现在有意义吗?
  • 是的,这是有道理的。真的很奇怪,但很有意义。给我一分钟,我会再次更新。如果他有 1 和 2,但没有 4,或者 1 和 4,但没有 2,会发生什么?任何部分得分,或者如果全部 3 则仅 100 分,或者如果没有则为 0?
  • 如果他拥有所有三个,那么它将是 100,如果他只有 1,2,那么它将再次只有 100,如果他只有 1,那么再次只有 100。代码(1)= 100 , 代码(1,2,4) = 100, 代码 (2, 4) = 100, 代码(1,2) = 100
猜你喜欢
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多