Group By 不考虑更改

时间:2021-01-21 12:29:41

标签: sql sql-server

首先,如果之前有人问过这个,我深表歉意。

我收到一个查询,该查询返回国家名称与去年的预订。

但是,输出要求是将英国境内的 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

然而结果将是:

enter image description here

我怎样才能让它按修改后的国家/地区名称对其进行分组?有什么简单的方法吗?

谢谢!

1 个答案:

答案 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 byorder 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;
相关问题