有条件地将列名映射到行值

时间:2019-04-07 02:19:59

标签: sql amazon-redshift

假设我们有一个表,其中有一个邮政编码字段,其余为二进制字段(1或NULL),其名称对应于不同的地方。例如,想象该表有201个字段,第一个标题为“ zip code”的字段包含邮政编码,后一个字段为200个二进制值字段,标题为城市名称:芝加哥,纽约,休斯敦等。

假设第一行包含邮政编码11373。虽然可以使用合并查找第一个非空值并返回“ New York”,但也可以使用“ Elmhurst”之类的另一个值。

zip_code  new_york  chicago  elmhurst  dover  maspeth
10001        1        NULL     NULL    NULL    NULL
07801       NULL      NULL     NULL     1      NULL
11373        1        NULL      1      NULL     1

目标是将列名映射到每个邮政编码,并获得如下输出:

zip_code    city
 10001     new_york
 07801     dover
 11373     new_york
 11373     elmhurst
 11373     maspeth

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

这是SQL UNPIVOT的绝佳用例:

SELECT unpvt.*
FROM 
    #x UNPIVOT (v FOR statename IN (new_york, chicago,elmhurst, dover, maspeth)) AS unpvt

答案 1 :(得分:0)

一种方法使用union all

select zip_code, 'New York' as city from t where new_york = 1
union all
select zip_code, 'Chicago' as city from t where chicago = 1
union all
. . .