示例数据行:
| ID | First Name | Last Name | Federal Race Code |
| 101 | Bob | Miller | 01010 |
| 102 | Daniel | Smith | 00011 |
“联邦竞赛代码”字段包含二进制数据,每个“1”用于确定是否在特定Web表单上设置了特定复选框。例如,第一位是美洲印第安人,第二位是亚洲人,第三位是非裔美国人,第四位是太平洋岛民,第五位是白人。
我需要为每个设置为“1”的位生成一个单独的行。因此,鉴于上面的示例,我需要生成如下所示的输出:
| ID | First Name | Last Name | Mapped Race Name |
| 101 | Bob | Miller | Asian |
| 101 | Bob | Miller | African American |
| 102 | Daniel | Smith | Pacific Islander |
| 102 | Daniel | Smith | White |
有关如何解决此问题的任何提示或想法?
答案 0 :(得分:1)
您可以使用UNION的6个查询或一个UNPIVOT子句来执行此操作。
在任何情况下,您应该首先将该二进制逻辑拆分为6列:
SELECT *,
CASE WHEN federal_race_code & 16 = 16 THEN 1 ELSE 0 END as NativeAmerican,
..
CASE WHEN federal_race_code & 1 = 1 THEN 1 ELSE 0 END as White
FROM myTable
然后是UNION:
SELECT *, 'Native American' AS Race
FROM (<subquery>)
WHERE NativeAmerican = 1
UNION
...
UNION
SELECT *, 'White' AS Race
FROM (<subquery>)
WHERE White = 1
如果您使用的是Oracle或SQL服务器,请使用CTE。