2016-11-25 15 views
1

私はいくつかの医者への患者訪問を数回受けており、訪問ごとに独自のnote列を持っています。Postgresqlの複数の列内での出現数

各訪問には、スタッフが作成した各訪問のメモが記載されています。例えばNote_visit1,Note_visit2,Note_visit3。 各訪問にはスタッフのIDの記録もあります。 StaffID_visit1,StaffID_visit2,StaffID_visit3

私の問題は、この質問に答えるためにしようとしている:各患者の各スタッフによって作られたノートの

数。

テーブルはこのように見えますが、ダムノートは無視されます。私はあなたがこのような何かしたいと思います

patientID| Note_V1 | StaffID_v1 | Note_V2 | StaffID_v2 |  
1  | "cat" | 101   | "dog" | 102   | 
2  | "camel" | 105   | "rat" | 101   | 
+1

注意を。このようなクエリはずっと簡単になります。テーブルデザインは悪いです。無条件に悪いです。なぜなら、そのようなクエリは難しいからです。また、各訪問の日時などの重要なデータが不足しているように見えます。まあ、... –

+0

私はちょうどそれがポストであまりにも多くのスペースを取るので、私はちょうどここにそれを含めないことを選択したこれらのフィールドを欠場していない。 テーブルを改善するための提案はありますか? –

+0

テーブル 'PatientVisit':カラム' PatientID'、 'StaffID'、' Note'、(Date/Time、)... 'VisitID'カラムを自動的に割り当てたいと思うかもしれません。シーケンス、...)。その後、あなたの質問は本質的に自明です。あなたはまた、70回訪れる人に、すべての訪問のための十分なスペースがなく、そして他のすてきなものの問題にぶつからない。 1回の行で3回の訪問があった場合は、各条件を3回書く必要があります。 –

答えて

0

:あなたは、テーブルを正規化する理由であると

select patient_id, staffid, count(*) 
from ((select patient_id, staffid_v1 as staffid, note_v1 as note 
     from visits 
    ) union all 
     (select patient_id, staffid_v2 as staffid, note_v2 as note 
     from visits 
    ) union all 
     (select patient_id, staffid_v3 as staffid, note_v3 as note 
     from visits 
    ) 
    ) v 
where note <> '' 
group by patient_id, staffid; 
+0

ありがとう、あなたのクエリはトリックでした! –

関連する問題