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

我以前从来没有发过这样的帖子

  • 这里是SQL新手
  • 我希望格式正确
  • 我一直在试图找到一种方法来处理这些数据,但还没有找到我认为符合我需要的东西。我需要基于另一列的值创建其他列(在我的情况下,基于观察列)

    我已经设法以我希望的方式使用多个case语句,但我得到了如下结果:

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