代码之家  ›  专栏  ›  技术社区  ›  Aymeric

如何根据其他字段值对字段求和?

  •  5
  • Aymeric  · 技术社区  · 15 年前

    我正在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     
    

    我想做的是按选择分组 ID NAME ,在名为 positive when ANSWER = 1 negative when ANSWER = 0 .

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

    我想我的问题已经被问过好几次了,但是我没有找到任何关于它的信息,可能是因为我使用了错误的术语。不管怎样,如果有人能帮忙的话,我会省很多时间的。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Will Marcouiller    15 年前

    你可以用一个案例陈述来做。

    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
    
        2
  •  2
  •   Donnie    15 年前

    使用以下列重写SQL:

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

        3
  •  1
  •   PatrickP61    15 年前

    伊菲斯门,

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

    两个独立查询的联合将能够回答这些问题,但不确定它是否适用于SQL server 2008。

    您可以使用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
    

    临时表(内部select with union)将返回类似于以下内容的行:

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

    最终选择将返回所需的结果(将它们相加)。