首先,如果之前有人问过这个,我深表歉意。
我收到一个查询,该查询返回国家名称与去年的预订。
但是,输出要求是将英国境内的 4 个国家/地区都归类为“英国”。
我的查询是:
select distinct
[Exiting Country] = case
when co.COUNTRY_NM in ('ENGLAND', 'N. IRELAND', 'SCOTLAND', 'WALES', 'UNITED KINGDOM')
then 'UK'
else co.COUNTRY_NM
end
,count(bk.booking_id) as [Number of Bookings]
from dbo.BOOKINGS as bk
left join dbo.COUNTRY as co
on bk.COUNTRY_ID = co.COUNTRY_ID
group by co.COUNTRY_NM
order by [Exiting Country] asc
然而结果将是:
我怎样才能让它按修改后的国家/地区名称对其进行分组?有什么简单的方法吗?
谢谢!
答案 0 :(得分:2)
您需要在 case
中重复 group by
表达式:
select (case when co.COUNTRY_NM in ('ENGLAND', 'N. IRELAND', 'SCOTLAND', 'WALES', 'UNITED KINGDOM')
then 'UK'
else co.COUNTRY_NM
end) as country,
count(bk.booking_id) as num_bookings
from dbo.COUNTRY co left join
dbo.BOOKINGS bk
on bk.COUNTRY_ID = co.COUNTRY_ID
group by (case when co.COUNTRY_NM in ('ENGLAND', 'N. IRELAND', 'SCOTLAND', 'WALES', 'UNITED KINGDOM')
then 'UK'
else co.COUNTRY_NM
end)
order by country asc;
注意查询的其他更改:
left join
被反转。据推测,即使没有匹配项,您也希望保留所有国家/地区。某些数据库允许您在 group by
和 order by
中使用列别名;唉,SQL Server 不是其中之一。
编辑:
您可以将其表述为:
select v.country,
count(bk.booking_id) as num_bookings
from dbo.COUNTRY co left join
dbo.BOOKINGS bk
on bk.COUNTRY_ID = co.COUNTRY_ID cross apply
(values (case when co.COUNTRY_NM in ('ENGLAND', 'N. IRELAND', 'SCOTLAND', 'WALES', 'UNITED KINGDOM')
then 'UK'
else co.COUNTRY_NM
end)
) v(country)
group by v.country
order by v.country asc;