2015-02-06 133 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 

我已经能够打破出来我怎么想使用多个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 

这将在技术上为我需要它的工作,但我知道它不是正确的,所以我希望我可以得到它类似于下面中行是基于观察相结合日期

理想情况下,它会l ook这样的事情:

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

显示您正在使用的查询来获取该中转结果。你可能只需要一些MINs或者将这些行分组为单行。 – Ditto 2015-02-06 18:07:42

+0

'CASE WHEN obshead.name ='bp舒张'THEN obs.value + obshead。单位结尾为'bp_dia' ,CASE WHEN obshead.name ='bp systolic'THEN obs.value + obshead。单位末尾为'bp_sys'' ... – Josh 2015-02-06 18:16:45

+0

所以你可以试试:min(CASE WHEN obshead.name ='bp diastolic'THEN obs.value + obshead。unit end)as'bp_dia',min(CASE WHEN obshead.name ='bp systolic'THEN obs.value + obshead。unit end)as'bp_sys'?? – Ditto 2015-02-06 18:24:16

回答

0

有几种方法可以做到这一点。 一种是通过相关子查询选择数据。 另一种是通过表值子查询。 另一种是由三个关键字组分组,并做一个分钟并处理空值。 我将在下面显示表格值选项。 您可以看到我已将主要患者数据与每个观察值分开,因为它是自己的数据集。然后将它们连接到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 2015-02-06 20:25:48