在 SQL 服务器中转置国家和城市

Transpose Country and City in SQL Server

我有一个 table,其中包含 2 个字段国家和城市。我想将其转换为我将国家/地区字段作为我的 headers 并将每个城市作为它们下面的字段。

当我使用下面提供的代码时,我得到了结果,但是有空值

SELECT
    CASE WHEN Country = 'USA' then City end as USA,
    CASE WHEN Country = 'India' then City end as India,
    CASE WHEN Country = 'UK' then City end as UK
FROM Country

Result from code

我的问题是如何获得没有空值的结果?

您可以将这些汇总为 max(CASE WHEN ... END) AS ....

或者您可以使用数据透视表:

SELECT
    p.* 
FROM 
    Country
    PIVOT (MAX(City) FOR Country IN (USA, India, UK)) P

为了获得您正在寻找的结果,您需要为每个城市引入国家/地区特定标识符(例如:美国:{1:纽约,2:洛杉矶}),如下所示:

select * 
from 
(
     select 
        *, 
        ROW_NUMBER() over (partition by country order by City, Country) id  
     from Country 
)  c
pivot
(
     max(city) for country in(usa, uk, india)
) p

您可以使用条件聚合来做到这一点:

SELECT MAX(CASE WHEN Country = 'USA' then City end) as USA,
       MAX(CASE WHEN Country = 'India' then City end) as India,
       MAX(CASE WHEN Country = 'UK' then City end) as UK
FROM Country
GROUP BY City;