在某些条件下使用Sum

时间:2013-10-29 15:18:22

标签: sql-server sql-server-2008 tsql

我说过以下几行

Country Population
IE  30
IE  20
UK  15
DE  20
DE  10
UK  20
BE  5

所以基本上我只想为IE和DE一起净值...其余的我只想要值

所以这将把它们全部加起来..

Select Country, Sum(Population) From CountryPopulation group by Country

我可以添加一个where子句来排除除IE和DE之外的所有其他国家...但我也希望在结果集中使用这些但只是没有求和。

所以当总结时,上面的表格会是这样的

Country Population
IE  50         -- Summed
UK  15         -- Orginal Value
DE  30         -- Summed
UK  20         -- Orginal Value
BE  5          -- Orginal Value

问题是,如果查询必须按group by聚合,我无法获得总和。只有其他方式我才能做到

将所有IE和DE相加并将其与其余数据结合起来。

也许使用CTE

这样做有一个很好的方式....

3 个答案:

答案 0 :(得分:4)

Select Country, Sum(Population) 
From CountryPopulation 
group by case when Country in ('IE','DE')
              then 'IE_DE'
              else Country
         end

答案 1 :(得分:2)

declare @t table (Country char(2), Population int)
insert into @t (Country, Population) values
('IE',30),
('IE',20),
('UK',15),
('DE',20),
('DE',10),
('UK',20),
('BE',5 )

; With Ordered as (
    select Country,Population,CASE
                                 WHEN Country in ('IE','DE') THEN 1
                                 ELSE ROW_NUMBER() OVER (ORDER BY Country)
                               END as rn
    from @t
)
select Country,rn,SUM(Population)
from Ordered
group by Country,rn

产地:

Country rn                   
------- -------------------- -----------
BE      1                    5
DE      1                    30
IE      1                    50
UK      6                    15
UK      7                    20

诀窍是只为每一行引入一个唯一值,但IEDE行除了1之外的所有行。实际上,如果源行全部已经具有这样的唯一值,则可以简化(或避免使用CTE,代价是必须将CASE表达式放在GROUP BY以及{ {1}})

答案 2 :(得分:1)

您还可以使用UNION ALL并将此查询分为两个:

SELECT P.country, 
       P.population 
FROM  (SELECT country, 
              Population = Sum(population) 
       FROM   dbo.countrypopulation cp 
       WHERE  country IN ( 'IE', 'DE' ) 
       GROUP  BY country 

       UNION ALL 

       SELECT country, population 
       FROM   dbo.countrypopulation cp 
       WHERE  country NOT IN ( 'IE', 'DE' )
      ) P 
ORDER  BY P.population DESC 

即使这不是那么简洁,它也是可读和有效的。

sql-fiddle