2

我说了以下几行

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

问题是我无法得到一个总和,如果或案例工作,因为查询必须按分组聚合。我能做的唯一其他方法就是

将所有 IE 和 DE 相加,并将其与其余数据结合起来。
或者
也许使用 CTE

有没有一种很好的方法来做到这一点......

4

3 回答 3

4
Select Country, Sum(Population) 
From CountryPopulation 
group by case when Country in ('IE','DE')
              then 'IE_DE'
              else Country
         end
于 2013-10-29T15:19:50.727 回答
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行都得到 a 1。如果所有源行实际上已经具有这样的唯一值,则可以简化 CTE(或避免,但必须将CASE表达式放在GROUP BY和 中SELECT

于 2013-10-29T15:24:28.843 回答
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

于 2013-10-29T15:27:57.593 回答