0

我很喜欢泡菜!我正在检查一个表格,其中包含与患者疫苗相关的信息。对于每位患者,有 3 种可能的疫苗存储在四行中。这些疫苗具有相关的是/否值,用于描述疫苗是否有效。这些疫苗行中的每一个都有一个“静态”de_name 列,其中包含可能被管理的疫苗的名称。如果疫苗的值为“是”,则还有一个相关的行包含接种疫苗的日期值。幸运的是,包含日期的第二行还包含该字段的名称,可用于推断接种了哪种疫苗。由于该表的行性质,除了将每种可能性转化为它之外,没有明显的方法(对我而言)来搜索每个患者 s 自己的列并合并结果。这使我能够为接种的疫苗和接种疫苗的日期创建两个漂亮的列。这很有效,因为我不需要引用与是/否值相关的行,因为疫苗的名称和存在日期的事实允许我只使用日期字段本身。

在我被要求添加第四种疫苗之前,一切都很好而且很花哨,它不是持有是/否值,而是包含自由文本。我被要求将自由文本与其他疫苗的“静态”文本放在同一列中。这是一个问题,因为与其他疫苗不同,第四个疫苗日期行中没有显示非日期行疫苗自由文本条目的列。我必须引用第四行的自由文本,同时还要引用第四行的相关疫苗日期行的日期值。问题出现在何时,我不知道如何在合并语句中的 Case 语句中加入行(通过永久访问号码)!任何帮助都会很棒!

如果您需要我提供任何其他数据,请告诉我。我担心地包括了一些虚拟数据以及我的查询当前将显示的内容。

Data_Points 表:

 De_Num       De_Name                        De_Value     Perm_Visit_Num    PatientID

 6224       Flu vaccine                        yes             10111           12
 6225    Flu vaccine date administered       11/00/2012        10111           12
 6226     Pneumonia vaccine                    yes             10112           12
 6227  Pneumonia vaccine date administered   11/01/2012        10112           12
 6228      Tetanus vaccine                     yes             10113           12
 6229   Tetanus vaccine date administered    11/02/2012        10113           12
 6230      Other vaccine                 arbitrary free-text   10114           12
 6231  Other vaccine date administered       11/03/2012        10114           12
 6224       Flu vaccine                        yes             10115           10
 6225    Flu vaccine date administered       11/00/2012        10115           10
 6226     Pneumonia vaccine                    yes             10116           10
 6227  Pneumonia vaccine date administered   11/01/2012        10116           10
 6228      Tetanus vaccine                     yes             10117           10
 6229   Tetanus vaccine date administered    11/02/2012        10117           10
 6230      Other vaccine              more arbitrary free-text 10118           10
 6231  Other vaccine date administered       11/03/2012        10118           10    

我的查询

select * 
from
(select
        COALESCE(
            CASE
                WHEN de_num = '6225' THEN DE_Name
            END,
            CASE
                WHEN de_num = '6227' THEN DE_Name
            END,
            CASE
                WHEN de_num = '6229' and perm_visit_num in (select perm_visit_num from data_points where de_num = '6228' and de_value = 'Yes') THEN de_name
            END,
            CASE
                WHEN de_num = '6230' THEN DE_Value
            END
        ) VaccineAdministered,
        COALESCE(
            CASE
                WHEN de_num = '6225' THEN CASE DE_Value WHEN null THEN null ELSE DE_Value END
            END,
            CASE
                WHEN de_num = '6227' THEN CASE DE_Value WHEN null THEN null ELSE DE_Value END
            END,
            CASE
                WHEN de_num = '6229' and perm_visit_num in (select perm_visit_num from data_points where de_num = '6228' and de_value = 'Yes') THEN CASE DE_Value WHEN null THEN null ELSE DE_Value END
            END,
            CASE
                WHEN de_num = '6230' THEN 'foo'
            END
        )
from data_points
WHERE DE_Num in ('6227','6225','6229','6230')
)
where vaccineadministered != ''

具有该虚拟数据的结果集和上面的当前 sql 查询:

Vaccine Administered                   DateAdministered

Flu vaccine date administered             11/00/2012
Pneumonia vaccine date administered       11/01/2012
Tetanus vaccine date administered         11/02/2012
arbitrary free-text                          foo
Flu vaccine date administered             11/00/2012
Pneumonia vaccine date administered       11/01/2012
Tetanus vaccine date administered         11/02/2012
more arbitrary free-text                     foo

我的问题是我无法找到同时提取自由文本和相关日期的方法。我可以得到或,在这个查询中我得到自由文本。

请理解这是一件很难解释的事情,我真的需要帮助。谢谢!

4

1 回答 1

2

经过进一步思考,这就是您所需要的。我最初认为 de_num 是主键,但我认为它是某种条目类型。那么这不是一个糟糕的结构:

Select
  v.vaccine As "Vaccine Administered",
  d.de_value As DateAdministered
From (
  Select
    Perm_Visit_Num,
    Case When de_num = 6230 Then de_value else de_name end As vaccine
  From
    data_points
  Where
    de_num in (6224, 6226, 6228, 6230) -- change this to (6225, 6227, 6229, 6230) to display the exact results you had in mind
  ) v
  Inner Join (
  Select
    Perm_Visit_Num,
    de_value
  From
    data_points
  Where
    de_num in (6225, 6227, 6229, 6231)
  ) d
    On v.Perm_Visit_Num = d.Perm_Visit_Num

这将加入疫苗记录以及所有情况下的给药日期记录。如果要显示其他值,可以在第一部分中使用 de_nums。

这假设每个 perm_visit_num 只有两个条目。如果您可以在一次访问中获得两种“其他疫苗”,那么这种结构根本无法应对。

http://sqlfiddle.com/#!3/4a8dd/16/0

于 2012-11-05T23:38:26.460 回答