【问题标题】:Transpose Country and City in SQL Server在 SQL Server 中转置国家和城市
【发布时间】:2016-04-23 20:21:12
【问题描述】:

我有一个包含 2 个字段 Country 和 City 的表。我想将其转换为我将 Country 字段作为我的标题,并将每个城市作为它们下面的字段。

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

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

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

【问题讨论】:

    标签: sql-server transpose


    【解决方案1】:

    您可以将这些聚合为 max(CASE WHEN ... END) AS ....

    或者你可以使用pivot:

    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
    

    【讨论】:

    • 这两个都只返回1行数据
    • 那么,您在每个国家/地区都有多个城市,并且希望生成带有城市行的国家名称列,对吗?
    • 是的,我在代码下方提供了一个指向我当前结果图片的链接。我每个国家有 3 个城市,希望看到所有城市。 3 列 3 行是我想要的输出
    • 为我的答案添加了必要的更改。
    【解决方案2】:

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

    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;
    

    【讨论】:

    • 这只会为我返回第一行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2014-09-08
    • 2016-07-16
    相关资源
    最近更新 更多