0

私はかなりピクルスにいます!患者のワクチンに関する情報を含むテーブルをチェックしています。患者ごとに、4 つの列に 3 つの可能なワクチンが保管されています。これらのワクチンには、ワクチンが有効であったかどうかを表す関連する yes/no 値があります。これらのワクチン行にはそれぞれ、投与される可能性のあるワクチンの名前を保持する「静的な」de_name 列がありました。ワクチンの値が yes の場合、ワクチンが投与された日付の値を保持する関連行もあります。幸いなことに、日付を含むこの 2 行目にはフィールドの名前も含まれており、どのワクチンが投与されたかを推測するために使用できました。このテーブルの行の性質により、各可能性をそれに変換する以外に、各患者を検索する明白な方法は (私には) ありませんでした。独自の列を作成し、結果を結合します。これにより、投与されたワクチンとワクチンが投与された日付の両方について、2 つのきれいな列を作成することができました。ワクチンの名前と日付が存在するという事実により、日付フィールド自体のみを使用できたため、yes/no 値に関連する行を参照する必要がなかったため、これは機能しました。

はい/いいえの値を保持する代わりに、フリーテキストを含む4番目のワクチンを追加するように求められるまで、すべてがうまくいきました. フリーテキストを他のワクチンの「静的」テキストと同じ列に配置するように依頼されました. 残りのワクチンとは異なり、4 番目のワクチンの日付行には、日付以外の行のワクチンのフリーテキスト エントリを表示する列がなかったため、これは問題です。4 行目のフリーテキストを参照しながら、4 行目の関連するワクチンの日付行の日付値も参照する必要がありました。問題が発生するのは、合体ステートメント内の 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 に 2 つのエントリしかないことを前提としています。1回の訪問で2つの「他のワクチン」を取得できる場合、この構造では対応できません.

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

于 2012-11-05T23:38:26.460 に答える