2016-07-19 22 views
0

Ich bin ratlos, wie man elegant, um Daten aus Zeilen in Spalten in anderen Tabellen abzubilden.Mapping Zeilen in Spalten in verschiedenen Tabellen

Eingabetabelle

FORM_SUBMISSION Tabelle -

ID = Das Formular Identifier ENTRY_ID = Die Frage Identifier RESPONSE = Ihre Antwort

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. 

Ich brauche es, um ein paar zu kartieren Tabellen PATIENT_INFO, PATIENT_OUTCOME

Output-Tabellen

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 

So gibt es keine direkte Möglichkeit, die Zeilen zu den Spalten zu verknüpfen, es möglich wäre, eine zu schaffen Mapping basierend auf dem ENTRY_ID und Spaltenname? Ich weiß zwar für die IND Spalten basieren auf allen Zeilen mit ENTRY_ID = 30.

+0

@sstan sorry, ich Mißverständnis sein kann, ist aber nicht die gewünschten Ergebnisse, was ich aufgeführt in 'PATIENT_INFO' und' PATIENT_OUTCOME' ? Ich versuche, Quelltabelle 'FORM_SUBMISSION' zu Zieltabellen' PATIENT_INFO' und 'PATIENT_OUTCOME' – Alan

+1

@sstan ahh, ich bearbeiten meinen Beitrag zu mehr klar darüber zu verwandeln. – Alan

Antwort

1

Es ist möglich, mit bedingten Aggregation zu tun. Aber am Ende müssen Sie noch die Regeln herausfinden, um die Abbildungen richtig zu machen.

Hier finden Sie einige SQL Probe basiert auf meiner sehr grundlegendes Verständnis davon, wie das Mapping funktioniert. Sie müssen es wahrscheinlich weiter optimieren.

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

danke! Gibt es eine Möglichkeit, eine Tabelle für das Mapping zu verwenden, anstatt sie mit der entry_id hart zu codieren? – Alan

+0

Ich nehme an, es ist möglich, eine andere Tabelle '[entry_id, Eintragsname]' zu erstellen, die Sie auf beitreten könnten, und dann werden die 'case' Ausdrücke auf ein' entry_name' statt einer Nummer überprüfen konnte. Aber meiner Meinung nach ist der Teil, der ein bisschen * hässlicher * ist, wie in 'patient_outcome' auch gegen einen bestimmten Wert in' response' zu ​​prüfen ist. Das scheint mir ein wenig klobig zu sein, aber ich bin mir nicht sicher, ob Sie viel dagegen tun können. – sstan

+0

@Alan Wie wäre es mit 'patient_info' und' patient_outcome' Ansichten? – user272735

Verwandte Themen