2017-01-03 12 views
1

私はこのクエリを構成しようとしていますが、その方法を考えることはできません。私のクエリは以下の通りです:条件が満たされている場合にのみデータをフィルタリングする

select per.Forenames, per.Surname, p.Identifier2 
from patient p 
join Person per on per.PersonID = p.PersonID 
where not exists (select 1 
       from Episode e 
       where e.PatientID = p.PatientID and 
        e.EpisodeTypeID in ('FCB9EAA0-C814-413E-A5FC-48547EF973B7', 
             'E422A8FA-839B-44AD-9A60-6973FEF39361', 
             '08929D40-863E-4D46-94BD-B4DF9352A855', 
             'C8BE80C4-AA0A-41ED-A44C-BCBE2CC980C0', 
             '8C3848C7-8621-43CF-A58D-D4A6ED4DC166', 
             'C244B01A-E9DD-4BF4-B336-1479A5A7C88D', 
             '632FAC1E-6B04-4A69-8BF2-0C2E2B0AD8AB' 
             ) and 

        e.EpisodeDate between '2016-04-01' and '2016-12-15' 

      ) 
and p.PatientStatus = 'Current' 
group by p.Identifier2, per.Forenames, per.Surname 

このクエリーは、特定のエピソードタイプに参加していない場合にのみ、特定の人物を見つけることです。今私がやりたいことは、これをさらにフィルタリングすることです。 のID「9254B31D-A304-498C-ADE4-F4003997C8FA」のエピソードタイプに参加している場合は、このリストに表示されるはずですが、のアテンダントステータスが設定されている場合〜 'はい'。それ以外の場合は、私はそれらを表示したくありません。

このフィルタはどこに追加できますか?

+0

ホースの状態が「内部クエリ」 –

答えて

1

ロジックのこのタイプはgroup byhavingを使用して行うことが容易である:

select per.Forenames, per.Surname, p.Identifier2 
from patient p join 
    Person per 
    on per.PersonID = p.PersonID join 
    Episode e 
    on e.PatientID = p.PatientID 
group by per.Forenames, per.Surname, p.Identifier2 
having sum(case when e.EpisodeTypeID in ('FCB9EAA0-C814-413E-A5FC-48547EF973B7', 
             'E422A8FA-839B-44AD-9A60-6973FEF39361', 
             '08929D40-863E-4D46-94BD-B4DF9352A855', 
             'C8BE80C4-AA0A-41ED-A44C-BCBE2CC980C0', 
             '8C3848C7-8621-43CF-A58D-D4A6ED4DC166', 
             'C244B01A-E9DD-4BF4-B336-1479A5A7C88D', 
             '632FAC1E-6B04-4A69-8BF2-0C2E2B0AD8AB' 
             ) and 
        e.EpisodeDate between '2016-04-01' and '2016-12-15' 
       then 1 else 0 
      end) = 0 and 
      sum(case when e.EpisodeTypeId = '9254B31D-A304-498C-ADE4-F4003997C8FA' and 
         e.AttendedStatus <> 'Yes' -- assumes AttendedStatus is not NULL 
        then 1 else 0 
       end) = 0; 

sum()式が条件のための一致の数をカウント

+0

ありがとうございました。私が必要としたのとまったく同じように働いた。 – Sp00kyy

0

したい場合、私はちょうどand existsのための別の条件を追加します次のような既存の条件を超える追加の条件:

select per.Forenames, per.Surname, p.Identifier2 
from patient p 
... 
and p.PatientStatus = 'Current' 
and exists (
    select 1 
    from Episode e1 
    where e1.PatientID = p.PatientID 
    and e1.EpisodeTypeID = '9254B31D-A304-498C-ADE4-F4003997C8FA' 
    and e1.AttendedStatus = 'Yes' 
    ) 
group by ... 
関連する問題