Crystal Reports SQL使用多个IN语句

时间:2015-12-08 17:05:39

标签: sql crystal-reports

表字段:patient_id,result_id,result_value

Result_ID是:

  • 19 = BP舒张压
  • 20 = BP收缩压
  • 11408 = A1C
  • 13731 = A1C
  • 11379 = LDL
  • 11515 = LDL
  • 12134 = LDL

查询示例:

Select from lab_observation LO
where LO.result_id in (19,20,11379,11515,12134,11408,13731)

结果:

patient_id    result_id    label           value 
123           19           BP Systolic     120
123           20           BP Diastolic    80
123           11379        LDL             1.2
123           11408        A1C             7.1
456           19           BP Systolic     120
456           20           BP Diastolic    80

但是,当我将查询更改为:

时,我只想看病人123
Select * from lab_observation LO
where LO.result_id in (19,20) and LO.result_id in(11379,11515,12134) 
and LO.results_id in (11408,13731)

它不会使患者返回123.

以下是所需的表格。

表:

Lab_observation:

observation_value    label        result_id    group_id
140                  BP-Systolic  19           1067613
90                   BP-Diastolic 20           1067613
.071                 A1C          11408        1067613
2.2                  LDL          11515        1067613
.08                  A1C          11408        1142318

Lab_observation_group:

group_id            patient_id
1067613             123
1142318             456
1042258             123

*** group_id是唯一的。 Patient_id在此表中确实有多个group_id。现在我想到了我真正想要的是具有全部四个结果的group_ids。

我尝试了这个,但它不起作用:

SELECT a.*
FROM lab_observation_group a
 JOIN (    SELECT group_id 
      FROM lab_observation LO
      GROUP BY group_id 
      HAVING MAX(CASE WHEN LO.result_id in (19,20) THEN 1 END) = 1
         AND  MAX(CASE WHEN LO.result_id in (11379,11515,12134) THEN 1                         
        END)=1
         AND  MAX(CASE WHEN LO.result_id in (11408,13731) THEN 1 END) = 1
 )b
ON a.group_id = b.group_id

没有结果,但我认为这接近我的需要。再次感谢大家的帮助。

2 个答案:

答案 0 :(得分:0)

如果您想要在多行中要求满足一组条件,则需要使用聚合,我不知道水晶报告语法,但您可能会在HAVING中使用条件聚合子句:

SELECT patient_id 
FROM lab_observation LO
GROUP BY patient_id 
HAVING MAX(CASE WHEN LO.result_id in (19,20) THEN 1 END) = 1
  AND  MAX(CASE WHEN LO.result_id in (11379,11515,12134) THEN 1 END) = 1
  AND  MAX(CASE WHEN LO.result_id in (11408,13731) THEN 1 END) = 1

这将为您提供符合此条件的patient_id值,您可以在子查询中使用它来获取这些患者的完整记录:

SELECT a.*
FROM lab_observation a
JOIN (    SELECT patient_id 
          FROM lab_observation LO
          GROUP BY patient_id 
          HAVING MAX(CASE WHEN LO.result_id in (19,20) THEN 1 END) = 1
             AND  MAX(CASE WHEN LO.result_id in (11379,11515,12134) THEN 1 END) = 1
             AND  MAX(CASE WHEN LO.result_id in (11408,13731) THEN 1 END) = 1
     )b
ON a.patient_id = b.patient_id 

答案 1 :(得分:0)

你的WHERE中有一个不可能的条件。让我们简化一下,告诉你哪里出错了。

Select * from lab_observation LO
where LO.result_id in (19) and LO.result_id in (11379) 

基本上,上面的查询与

相同
Select * from lab_observation LO
where LO.result_id = 19 and LO.result_id = 11379

这永远不会返回任何行。 WHERE条件是逐行评估的。一行的结果id不可能与这两个数字相等。

如果您要在第一个查询和患者123中过滤包含这些结果ID的记录,那么这就是您过滤的内容。

Select from lab_observation LO
where LO.result_id in (19,20,11379,11515,12134,11408,13731)
and LO.patient_id = 123