【问题标题】:Generate multiple rows for a binary number field?为二进制数字段生成多行?
【发布时间】:2014-09-06 05:28:42
【问题描述】:

示例数据行:

| 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             |

关于如何进行此操作的任何提示或想法?

【问题讨论】:

标签: sql openedge


【解决方案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

然后联合:

SELECT *, 'Native American' AS Race 
FROM (<subquery>)
WHERE NativeAmerican = 1
UNION
...
UNION
SELECT *, 'White' AS Race 
FROM (<subquery>)
WHERE White = 1

如果您使用的是 Oracle 或 SQL 服务器,请使用 CTE。

【讨论】:

  • 我最终将它拆分为另一个表中的六列(OpenEdge Progress -> Bulk insert into my own SQL cache),然后进行了一系列联合。它可能不像 unpivot 那样优雅,但要容易得多。感谢您的帮助!
猜你喜欢
  • 2014-01-15
  • 2015-11-25
  • 2021-12-09
  • 2018-05-20
  • 1970-01-01
  • 2013-08-19
  • 2016-02-11
  • 2022-12-03
相关资源
最近更新 更多