如何根据其他字段值总结字段?

时间:2010-11-19 16:08:42

标签: sql sql-server

我正在SQL Server 2008上开发一个小的存储过程。我对SQL查询知之甚少,但足以完成简单的任务。但是我想出了一个我无法解决的问题。在我开始解释我的问题之前,请原谅我,如果我拼错SQL查询字,因为我不是母语为英语的人。

我有4个字段(CSV表示):

ID, NAME, VALUES, ANSWER
25, Tom , 2400 , 0                
25, Tom , 600 , 0                
25, Tom , 500 , 1                
25, Tom , 300 , 1                
27, Jerry, 100, 0                
27, Jerry, 20, 1                
27, Jerry, 60, 1                
27, Jerry, 2000, 0     

我想要做的是按照IDNAME的选择进行分组,在名为positive when ANSWER = 1negative when ANSWER = 0的字段中汇总它的值。

ID, NAME, SUM, NEGATIVE, POSITIVE
25, Tom, 3000, 800                   
27, Jerry, 2100, 80

我猜我的问题已被问过几次,但我无法找到任何关于它的信息,可能是因为我使用了错误的条款。无论如何,如果有人可以提供帮助,那将节省我很多时间。

3 个答案:

答案 0 :(得分:4)

您将使用CASE声明进行此操作。

select Id
        , Name
        , SUM(case when answer = 1 then Values else 0 end) as Positive
        , SUM(case when answer = 0 then Values else 0 end) as Negative
    from MyTable
    group by Id
        , Name

答案 1 :(得分:2)

使用以下列重写SQL:

sum(case when answer=0 then values else 0 end) negative

答案 2 :(得分:1)

Ephismen,

您提供的示例中存在隐藏的问题。你总是至少有一个正面和一个负面吗?如果你只有一个或另一个而不是两者,你想要发生什么?当每个id和名称有多行时,将表连接到自身将不起作用。

两个单独查询的UNION将能够回答这些问题,但不确定它是否适用于SQL Server 2008.

您可以通过对SQL使用group by子句来实现此目的:

select id
     , name
     , sum (neg_values)    as negative
     , sum (pos_values)    as positive
  from                                    -- temporary table
     ( select id
            , name
            , sum (values) as neg_values
            , 0            as pos_values  -- placeholder
         from mytable
        where answer  = 0                 -- negative
        group by id
               , name
        union all
       select id
            , name
            , 0            as neg_values  -- placeholder
            , sum (values) as pos_values
         from mytable
        where answer  = 1                 -- positive
        group by id
               , name
      )
  group by id
         , name

临时表(带联合的内部选择)将返回与此类似的行:

id  name neg_value pos_value
25  tom       3000         0
25  tom          0       800
27  jerry     2100         0
27  jerry        0        80

最终选择将返回您想要的结果(将它们加在一起)。