4

データベースSQLフィドル

必要なクエリ:各保険会社の25〜35歳の女性と男性の数を返す。

私の進歩

CREATE VIEW MenInAge AS
SELECT p.pname,p.pid,p.cid
FROM Patient p
WHERE p.gender = 'm' and p.age between 25 and 35;

CREATE VIEW WomenInAge AS
SELECT p.pname,p.pid,p.cid
FROM Patient p
WHERE p.gender = 'f' and p.age between 25 and 35;

CREATE VIEW MenInAgeCount AS
SELECT m.cid, COUNT(m.pid) as c
FROM MenInAge m
GROUP BY m.cid;

CREATE VIEW WomenInAgeCount AS
SELECT w.cid, COUNT(w.pid) as c
FROM WomenInAge w
GROUP BY w.cid;

すべてのInsuranceCompany.cidに対してWomenInAgeCount.c列とMenInAgeCount.c列を表示するにはどうすればよいですか?

4

3 に答える 3

4

説明:

テーブルを結合InsuranceCompaniesし、 LEFT OUTER JOINPatientを使用して両方のテーブルの列のレコードを結合し、フィルターを適用して2535歳(これらの境界値を含む) の患者のみを選択する必要があります。CASEステートメントは、患者が男性か女性かを単純にチェックし、値が一致する場合は 1 を割り当て、値が一致しない場合は 0 を割り当てて、2 つの異なる列を計算します。最後に、結果を cname でグループ化し、保険会社名でカウントを取得する必要があります。cid

ケースについての説明

CASE 式では、クエリは、WHEN 性別フィールド値がfである場合、女性列に値 1 を割り当てることを示しています。値 1 はハード コードされています。これは、クエリが、gender='f' レコードに一致する行が 1 つ見つかったことを意味し、これも 1 を表すためです。人。ELSE 0 を指定することもできますが、暗黙的であるため指定する必要はありません。この CASE 式は、クエリ結果のすべてのレコードに対して評価されます。最後に、1 または 0 のいずれかを含む女性の列を含むすべての行を取得します。この列の女性を合計すると、女性の総数が得られます。男性の列にも同じロジックが適用されます。

COALESCE を使用する場合:

COALESCEここでは、NULL 値を 2 番目のパラメーターで指定された値 (この場合はゼロ) に置き換えます。

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

スクリプト:

SELECT              ic.cname
                ,   COALESCE(SUM(CASE WHEN gender = 'f' THEN 1 END), 0) female
                ,   COALESCE(SUM(CASE WHEN gender = 'm' THEN 1 END), 0) male 
FROM                InsuranceCompanies ic
LEFT OUTER JOIN     Patient p
ON                  p.cid = ic.cid
AND                 age BETWEEN 25 AND 35
GROUP BY            ic.cname;

出力:

CNAME      FEMALE MALE
---------- ------ ----
Clalit Inc    0    2
Harel Inc     2    0

合体なし:

SQL Fiddle でデモを表示するには、ここをクリックしてください

スクリプト:

SELECT              ic.cname
                ,   SUM(CASE WHEN gender = 'f' THEN 1 END) female
                ,   SUM(CASE WHEN gender = 'm' THEN 1 END) male 
FROM                InsuranceCompanies ic
LEFT OUTER JOIN     Patient p
ON                  p.cid = ic.cid
AND                 age BETWEEN 25 AND 35
GROUP BY            ic.cname;

出力:

CNAME      FEMALE MALE
---------- ------ ----
Clalit Inc  NULL   2
Harel Inc     2   NULL
于 2012-05-01T17:33:42.653 に答える
0

JOINはどうですか?

SELECT I.cname, ISNULL(W.c,0) AS WomenCount, ISNULL(M.c,0) as MenCount
FROM InsuranceCompanies AS I
LEFT JOIN MenInAgeCount AS M ON M.cid = I.cid
LEFT JOIN WomenInAgeCount AS W ON W.cid = I.cid

LEFT JOINこれは、InsuranceCompanies テーブルの各行のエントリが Men または Women ビューに含まれていない場合です。はISNULLSQL Server 用ですが、必要に応じて MySQL、Oracle 用に変更できます。

于 2012-05-01T17:30:24.580 に答える
0

これはあなたにいくつかの助けを与えるはずです-

select count(pid) as numPatients, cid, gender
from patient
group by cid, gender
于 2012-05-01T17:31:12.210 に答える