我现在很为难!我正在检查一个表,其中包含与患者疫苗相关的信息。对于每个患者,有三种可能的疫苗存储在四行中。这些疫苗有一个相关的yes/no值,它描述了疫苗是否有效。这些疫苗行中的每一行都有一个“静态”de_name列,其中保存了可能正在实施的疫苗的名称。如果疫苗的值为yes,则还有一个相关的行,其中包含疫苗接种时间的日期值。幸运的是,包含日期的第二行还包含字段的名称,可以用来推断接种的是哪种疫苗。由于该表的行属性,(对我而言)没有明显的方法来搜索每个患者,只能将每个可能性转换为它自己的列并合并结果。这使得我可以为接种的疫苗和接种疫苗的日期创建两个漂亮的列。这是可行的,因为我不需要引用与yes/no值相关的行,因为疫苗的名称和日期的存在允许我只使用日期字段本身。
一切都很好,直到我被要求添加第四种疫苗,而不是持有yes/no值,而是包含自由文本。我被要求将自由文本放在与其他疫苗“静态”文本相同的列中。这是一个问题,因为与其他疫苗不同,第四个疫苗日期行中没有显示非日期行疫苗自由文本条目的列。我必须引用第四行的自由文本,同时还要引用第四行的相关疫苗日期行的日期值。问题出现在什么时候,我不知道如何在coalesce语句中连接到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我的问题是,我找不到一种方法来同时提取自由文本和关联的日期。我可以得到或,在这个查询中,我得到了自由文本。
请理解这是一件很难解释的事情,我真的需要帮助。谢谢!
发布于 2012-11-06 07:38:26
经过进一步的思考,这就是你所需要的。我最初认为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
https://stackoverflow.com/questions/13242001
复制相似问题