2015-02-06 15 views
0

Я никогда не писал раньше, такSQL - Создание нескольких столбцов на основе значения

  1. SQL послушника
  2. Я надеюсь, что форматирование выходит правильно

Я пытался найти способ что я могу манипулировать этими данными, но мне еще нужно найти то, что, на мой взгляд, отвечает моим потребностям. Мне нужно создать дополнительные столбцы на основе значения другого столбца (в моем случае, основываясь на колонке Смотровой)

PID | Observation_Date | Observation_Time | Obs_Value | Observation 

1424285941000610 | 20050603 | 115459 | 110 mm Hg |BP Systolic 
1424285941000610 | 20050603 | 115459 | 80 mm Hg |BP Diastolic 
1424285941000610 | 20050603 | 115459 | N    |Smoking Status 
1424285941000610 | 20050912 | 141308 | 110 mm Hg |BP Systolic 
1424285941000610 | 20050912 | 141308 | 86 mm Hg |BP Diastolic 
1424285941000610 | 20051027 | 104202 | 195 lb  |Weight 
1424285941000610 | 20051027 | 104202 | 104 mm Hg |BP Systolic 
1424285941000610 | 20051027 | 104202 | 70 mm Hg |BP Diastolic 
1424285941000610 | 20060629 | 092852 | 61.5 in  |Height 
1424285941000610 | 20060629 | 092852 | 209 lb  |Weight 

мне удалось разбить его, как я хотел бы с помощью нескольких операторов случае, но я получаю что-то который выглядит следующим образом:

PID Obs_Date |Obs_Time |smoking status |bp_dia |bp_sys |Height |Weight 
1424285963050610 |20121203 |161415  |NULL |NULL |NULL |180lb 
1424285963050610 |20121203 |161415  |NULL |NULL |70in |NULL  
1424285963050610 |20121203 |161415  |NULL |138mm Hg |NULL |NULL 
1424285963050610 |20121203 |161415  |80mm Hg |NULL |NULL |NULL 

Какой будет технически работать для того, что мне это нужно, но я его не знаю, правильно, так что я надеюсь, что я могу заставить его выглядеть, как показано ниже, где строки объединяются на основе наблюдений дата

В идеале это будет l ООК что-то вроде этого:

PID |Obs_Date |Obs_Time |smoking status |bp_dia |bp_sys |Height |Weight 

1424285963050610 |20121203 |161415  |N |80 mmHg |110 mmHg |null |null 

Я также попытался с помощью вложенных заменить, но я в конечном итоге с той же проблемой, что это все в одном столбце.

Я использую SQL server 2008. Любая помощь приветствуется.

+1

показать запрос, который вы используете, чтобы получить результат промежуточного интервала. Вероятно, вам просто нужны некоторые MIN или такие, чтобы группировать строки в одну строку. – Ditto

+0

'CASE WHEN obshead.name = 'bp diastolic' THEN obs.value + obshead. unit end как 'bp_dia' , CASE WHEN obshead.name = 'bp systolic' THEN obs.value + obshead. конец блока как «bp_sys» ... – Josh

+0

, так что вы можете попробовать: min (CASE WHEN obshead.name = 'bp diastolic' THEN obs.value + obhead. unit end) как 'bp_dia', min (CASE WHEN obshead.name = 'bp systolic' THEN obs.value + obhead. unit end) как 'bp_sys' ?? – Ditto

ответ

0

Существует несколько способов сделать это. Одним из них является выбор данных через коррелированный подзапрос. Другое - это табличный подзапрос. Другим является просто группировка по трем ключевым полям и выполнение min и обработка нулей. Я собираюсь показать приведенную ниже таблицу. Вы можете видеть, что я отделил данные основных пациентов от каждого из наблюдений, так как это собственный набор данных. Затем связали их по 3 ключевым полям.

SELECT 
    pd.PID, pd.Observation_Date, pd.Observation_Time, 
    ss.Obs_Value, 
    bpd.Obs_Value, 
    bps.Obs_value, 
    h.Obs_Value, 
    w.Obs_Value 
FROM (SELECT DISTINCT PID, Observation_Date, Observation_Time FROM patient_data) AS pd 
    LEFT OUTER JOIN (SELECT PID, Observation_Date, Observation_Time, Obs_Value FROM patient_data WHERE Observation = 'Smoking Status') AS ss ON (pd.PID = ss.PID AND pd.Observation_Date = ss.Observation_Date AND pd.Observation_Time = ss.Observation_Time) 
    LEFT OUTER JOIN (SELECT PID, Observation_Date, Observation_Time, Obs_Value FROM patient_data WHERE Observation = 'BP Diastolic') AS bpd ON (pd.PID = bpd.PID AND pd.Observation_Date = bpd.Observation_Date AND pd.Observation_Time = bpd.Observation_Time) 
    LEFT OUTER JOIN (SELECT PID, Observation_Date, Observation_Time, Obs_Value FROM patient_data WHERE Observation = 'BP Systolic') AS bps ON (pd.PID = bps.PID AND pd.Observation_Date = bps.Observation_Date AND pd.Observation_Time = bps.Observation_Time) 
    LEFT OUTER JOIN (SELECT PID, Observation_Date, Observation_Time, Obs_Value FROM patient_data WHERE Observation = 'Height') AS h ON (pd.PID = h.PID AND pd.Observation_Date = h.Observation_Date AND pd.Observation_Time = h.Observation_Time) 
    LEFT OUTER JOIN (SELECT PID, Observation_Date, Observation_Time, Obs_Value FROM patient_data WHERE Observation = 'Weight') AS w ON (pd.PID = w.PID AND pd.Observation_Date = w.Observation_Date AND pd.Observation_Time = w.Observation_Time) 

Вот пример, вероятно, предпочтительного решения, которое состоит в том, чтобы просто сгруппировать и взять максимум.

SELECT 
    pd.PID, pd.Observation_Date, pd.Observation_Time, 
    MAX(CASE WHEN pd.Observation = 'Smoking Status' THEN pd.Obs_Value ELSE '' END) AS [smoking status], 
    MAX(CASE WHEN pd.Observation = 'BP Diastolic' THEN pd.Obs_Value ELSE '' END) AS [bp_dia], 
    MAX(CASE WHEN pd.Observation = 'BP Systolic' THEN pd.Obs_Value ELSE '' END) AS [bp_sys], 
    MAX(CASE WHEN pd.Observation = 'Height' THEN pd.Obs_Value ELSE '' END) AS [Height], 
    MAX(CASE WHEN pd.Observation = 'Weight' THEN pd.Obs_Value ELSE '' END) AS [Weight] 
FROM patient_data 
GROUP BY pd.PID, pd.Observation_Date, pd.Observation_Time 

Все это воздушный код, непроверенный.

+0

Спасибо, это сделал трюк для меня. – Josh

Смежные вопросы