我说过以下几行
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
这样做有一个很好的方式....
答案 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
诀窍是只为每一行引入一个唯一值,但IE
和DE
行除了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
即使这不是那么简洁,它也是可读和有效的。