【问题标题】:Mapping rows to columns in different tables将行映射到不同表中的列
【发布时间】:2016-07-19 22:07:17
【问题描述】:

我很困惑如何优雅地将数据从行映射到其他表中的列。

输入表

FORM_SUBMISSION表-

ID = 表单标识符 ENTRY_ID = 问题标识符 RESPONSE = 他们的回应

ID  ENTRY_ID   RESPONSE
4   24         John 
4   25         Doe
4   26         Male
4   32         NY
4   30         Life-Threatening
4   30         Other Serious
4   30         Hospitalization
4   28         Tylenol
4   31         I have a headache.

我需要将它映射到几个表PATIENT_INFO、PATIENT_OUTCOME

输出表

PATIENT_INFO

REPORT_ID    FIRST_NAME   LAST_NAME    STATE   GENDER    COMPLAINT
4            John         Doe          NY      Male      I have a headache.

PATIENT_OUTCOME

REPORT_ID    OTHER_SERIOUS_IND   LIFE_THREAT_IND    HOSPITAL_IND   DISABILITY_IND
4            Y                   Y                  Y              N

所以没有直接的方法将行链接到列, 是否可以根据ENTRY_ID 和列名创建映射?虽然我知道IND 列是基于ENTRY_ID = 30 的所有行。

【问题讨论】:

  • @sstan 抱歉,我可能有误解,但我在PATIENT_INFO 和PATIENT_OUTCOME 中列出的结果不是我想要的吗?我正在尝试将源表 FORM_SUBMISSION 转换为目标表 PATIENT_INFO 和 PATIENT_OUTCOME
  • @sstan 啊,我编辑了我的帖子以便更清楚地了解它。

标签: sql oracle plsql


【解决方案1】:

可以使用条件聚合。但是,最终,您仍然需要弄清楚正确进行映射的规则。

以下是一些基于我对映射工作原理的基本了解的示例 SQL。您可能需要进一步调整它。

PATIENT_INFO

select id as report_id,
       max(case when entry_id = 24 then response end) as first_name,
       max(case when entry_id = 25 then response end) as last_name,
       max(case when entry_id = 32 then response end) as state,
       max(case when entry_id = 26 then response end) as gender,
       max(case when entry_id = 31 then response end) as complaint
  from form_submission
 group by id

PATIENT_OUTCOME

select id as report_id,
       nvl(max(case when entry_id = 30 and response = 'Other Serious' then 'Y' end), 'N') as OTHER_SERIOUS_IND,
       nvl(max(case when entry_id = 30 and response = 'Life-Threatening' then 'Y' end), 'N') as LIFE_THREAT_IND,
       nvl(max(case when entry_id = 30 and response = 'Hospitalization' then 'Y' end), 'N') as HOSPITAL_IND,
       nvl(max(case when entry_id = 30 and response = '??Disability??' then 'Y' end), 'N') as DISABILITY_IND
  from form_submission
 group by id

【讨论】:

  • 谢谢!有什么方法可以使用表进行映射而不是使用 entry_id 对其进行硬编码?
  • 我想可以创建另一个可以加入的表[entry_id, entry_name],然后case 表达式可以检查entry_name 而不是数字。但在我看来,有点丑的部分是如何在patient_outcome 中检查response 中的特定值。这对我来说似乎有点笨拙,但我不确定你能做些什么。
  • @Alan 让patient_info 和patient_outcome 观看怎么样?
  • @user272735 我不熟悉视图。你能解释一下它会有什么帮助吗?
  • @Alan 视图是保存的查询,可以作为表查询。它会自动更新基础表中的数据更改。请参阅例如sql-view.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
相关资源
最近更新 更多