SQL-基于值创建多个列
我以前从来没有发过这样的帖子SQL-基于值创建多个列,sql,sql-server-2008,replace,case,Sql,Sql Server 2008,Replace,Case,我以前从来没有发过这样的帖子 这里是SQL新手 我希望格式正确 我一直在试图找到一种方法来处理这些数据,但还没有找到我认为符合我需要的东西。我需要基于另一列的值创建其他列(在我的情况下,基于观察列) 我已经设法以我希望的方式使用多个case语句,但我得到了如下结果: PID Obs_Date |Obs_Time |smoking status |bp_dia |bp_sys |Height |Weight 1424285963050610 |20121203 |16141
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
PID |Obs_Date |Obs_Time |smoking status |bp_dia |bp_sys |Height |Weight
1424285963050610 |20121203 |161415 |N |80 mmHg |110 mmHg |null |null
从技术上讲,这将为我所需要的工作,但我知道它是不正确的,所以我希望我可以让它看起来像下面的一样,根据观察日期合并行
理想情况下,它看起来像这样:
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
PID |Obs_Date |Obs_Time |smoking status |bp_dia |bp_sys |Height |Weight
1424285963050610 |20121203 |161415 |N |80 mmHg |110 mmHg |null |null
我也尝试过使用嵌套替换,但我最终遇到了相同的问题,因为它都在一列中
我正在使用
SQLServer2008
。非常感谢您的帮助 有几种方法可以做到这一点。
一种是通过相关子查询选择数据。
另一种是表值子查询。
另一种方法是仅按三个键字段分组,然后执行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
所有这些都是air代码,未经测试。显示用于获取interm结果的查询。您可能只需要几分钟左右就可以将行分组为一行。
CASE当obhead.name='bp'时,然后是obs.value+obhead。单位结束为“血压直径”,当obshead.name=“血压收缩”然后obs.value+obshead时为这种情况。单位端为'bp_sys'
…因此您可以尝试:min(当obhead.name='bp舒张期'时的情况下,然后obs.value+obhead.unit end)为'bp_dia',min(当obhead.name='bp收缩期'时的情况下,然后obs.value+obhead.unit end)为'bp_sys'??