-4

保険会社に関連するすべての整形外科医 (専門分野) を訪れた患者を検索します。

データベース:ここをクリックして、SQL Fiddle のサンプル データ スクリプトを表示します。

CREATE VIEW Orthos AS
SELECT  d.cid,d.did
FROM    Doctors d
WHERE d.speciality='Orthopedist';

CREATE VIEW OrthosPerInc AS
SELECT  o.cid, COUNT(o.did) as countd4i
FROM Orthos o
GROUP BY o.cid;

CREATE VIEW OrthoVisitsPerPat AS
SELECT v.pid,COUNT(o.did) as countv4d
FROM Orthos o,Visits v,Doctors d
WHERE o.did=v.did and d.did=o.did
GROUP BY v.pid,d.cid;

SELECT  p.pname,p.pid,p.cid
FROM  OrthoVisitsPerPat v, OrthosPerInc i,Patient p
WHERE i.countd4i = v.countv4d and p.pid=v.pid and p.cid=i.cid;

DROP VIEW IF EXISTS Orthos,OrthosPerInc,OrthoVisitsPerPat;

1つのクエリでどのように記述できますか?

試み:

これまでのところ、これを解決するための私の試みは次のとおりです。

SELECT  p.pid,p.pname,p.cid,COUNT(v.did)
FROM Visits v 
JOIN Doctors d ON v.did=d.did
JOIN Patient p ON p.pid=v.pid
WHERE d.cid=p.cid and d.speciality="Orthopedist"
GROUP BY p.pid,p.cid;

INTERSECT 

SELECT  p.pid,d.cid,COUNT(d.did)
FROM Doctors d 
JOIN Patient p ON p.cid=d.cid
WHERE d.speciality='Orthopedist'
GROUP BY d.cid;
4

3 に答える 3

11

持っているデータをよく理解してください。

最初に重要なことは、所有しているデータを理解することです。この場合、4 つのテーブルがあります。

  • 保険会社
  • 忍耐強い
  • 医師
  • 訪問

あなたの目標:

保険会社に関連するすべての整形外科医 (専門分野) を訪れたすべての患者のリストを検索します。

一歩下がって、より小さな部分に分けて分析しましょう。

一般に、要件を全体的に見ると、要件がやや圧倒される可能性があります。要件を小さなコンポーネントに分割して、何をする必要があるかを理解しましょう。

  1. パート a:専門が「整形外科医」である医師のリストを見つける必要があります。
  2. パート b: #1 で特定された医師を訪れた患者のリストを見つけます。
  3. パート c:結果 #2 をフィルタリングして、同じ保険会社を共有する患者と医師のリストを見つけます。
  4. パート d:患者と同じ保険会社に所属する整形外科医のそれぞれを訪れた患者を調べます。

アプローチ方法:

  1. 主な目標を特定する必要があります。ここでは、患者のリストを特定します。したがって、最初に患者テーブルをクエリします。

  2. 実際にはすべての患者がいますが、これらの患者のどれが医者を訪れたかを見つける必要があります。医者が整形外科医かどうかは気にしないようにしましょう。必要なのは、患者と彼らが訪れた医師のリストだけです。患者テーブルと医師テーブルの間にマッピングはありません。この情報を知るには、

    正しいキー フィールドで、患者テーブルを訪問テーブルと結合します。

    次に、出力を Doctors テーブルの正しいキー フィールドに結合します。

  3. 結合が正しく行われている場合は、すべての患者と彼らが訪れた医師のリストが表示されます。を使えばLEFT OUTER JOIN、今まで受診したことのない患者さんも見つかります。を使用RIGHT OUTER JOINした場合は、医師の診察を受けた患者のみが検索されます。

  4. これで、すべての患者と、彼らが訪れた医師が表示されます。ただし、要件は、整形外科医である医師のみを見つけることです。そのため、条件を適用して結果をフィルタリングし、目的の結果のみを提供します。

  5. これで、パートaパート bの小さなコンポーネントに分割された要件が達成されました。あなたはまだ保険会社によってそれをフィルタリングする必要があります. ここが難しい部分です。この要件では、保険会社を表示する必要があるとは言っていないので、テーブル InsuranceCompanies を使用する必要はありません。次の質問は'How am I going to filter the results?'. 有効なポイント。Patient3 つのテーブルのいずれかを調べ、保険会社の情報Doctorを含めます。そして共通のフィールドを持つ。その共通フィールドを結合して、結果をフィルタリングします。VisitsPatientDoctors

  6. 各患者が訪れた一意の整形外科医の数を求めます。

  7. これは多くの方法で実行できる部分です。これを行う方法の 1 つは、出力の 4 番目の列になるサブクエリを追加することです。このサブクエリは、表 Doctors をクエリし、専門分野 = 'Orthopedist' でフィルタリングします。そのフィルターに加えて、内部テーブルの保険会社を、メイン クエリにある Patients テーブルの保険会社 ID と照合してフィルター処理する必要もあります。このサブクエリは、患者のデータと一致する保険会社 ID のすべての整形外科医の数を返します。

  8. これで、フィールドpatient idpatient namepatients visits countおよびtotal number of Orthopedists in same insurance companyサブ クエリからの が得られます。patients visits count次に、 と一致 するフィールドでこの派生テーブルからの結果をフィルター処理する外部結合を追加できますtotal number of Orthopedists in same insurance company。これが最良のアプローチであると言っているわけではありません。これは私が考えることができる1つのアプローチです。

  9. 上記のロジックに従えば、これが必要です。

すべての医師を訪問した患者のリスト

整形外科医である医師のみによってフィルタリングされます

同じ保険会社の情報を共有している患者と医師によってフィルター処理されます。

ここでも、派生テーブル出力内にある 2 つのカウント フィールドによって、出力全体がフィルター処理されます。

ボールはあなたのコートにあります:

  • ステップバイステップで試してみて、答えが見つかったら試してみてください。別の回答としてここに投稿してください。この質問であなたが得たすべての反対票を補うために、賛成票を投じます。

これなら簡単にできると思います。

つまずいたら…

遠慮なく質問をcomments to this answer、その他として投稿してください。喜んでお手伝いさせていただきます。

免責事項

このロジックを実装する多くの方法の 1 つを提供しました。これをはるかに優れた方法で実装する方法はたくさんあると確信しています。

結果:

目的の出力を生成する正しいクエリについては、@Ofek Ron の回答を参照してください。クエリのどの部分も書きませんでした。それはすべてOPの努力でした。

于 2012-05-05T15:27:38.393 に答える
4

@Sivaの説明:

これは、パート1〜5の結果のコードです。

SELECT *
FROM Patient p
JOIN Visits v ON v.pid=p.pid
JOIN Doctors d ON d.did=v.did and d.cid=p.cid
WHERE d.speciality="Orthopedist"

パート6の適用:

SELECT p.pid,COUNT(d.did)
FROM Patient p
JOIN Visits v ON v.pid=p.pid
JOIN Doctors d ON d.did=v.did and d.cid=p.cid
WHERE d.speciality="Orthopedist"
GROUP BY p.pid

残りを適用する:SQL Fiddleでデモを表示するには、ここをクリックしてください。

SELECT p.pid,p.cid,COUNT(DISTINCT d.did) as c
FROM Patient p
JOIN Visits v ON v.pid=p.pid
JOIN Doctors d ON d.did=v.did and d.cid=p.cid
WHERE d.speciality="Orthopedist"
GROUP BY p.pid
HAVING (p.cid,c) IN 
  (SELECT d.cid,COUNT(DISTINCT d.did)
  FROM Doctors d
  WHERE d.speciality="Orthopedist"
  GROUP BY d.cid);
于 2012-05-05T16:03:12.080 に答える
0

多分このようなもの:

SELECT
    p.pname,
    p.pid,
    p.cid
FROM
    Patient AS p
    JOIN
    (
        SELECT v.pid,COUNT(o.did) as countv4d
        FROM    Doctors d
        JOIN    Visits v ON o.did=v.did
        WHERE d.speciality='Orthopedist'
        GROUP BY v.pid,d.cid;
    ) AS v
    ON p.pid=v.pid
    JOIN 
    (
        SELECT  o.cid, COUNT(o.did) as countd4i
        FROM    Doctors d
        WHERE d.speciality='Orthopedist'
        GROUP BY o.cid;
    ) AS i
    ON p.cid=i.cid
WHERE
    i.countd4i = v.countv4d
于 2012-05-05T14:49:35.440 に答える