2012-05-01 3 views
4

データベースSQL Fiddleある条件を別の列でグループ化して2つの列の数を取得するにはどうすればよいですか?

クエリはが必要:各保険会社のために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; 

はWomenInAgeCount.cとMenInAgeCount.c列をInsuranceCompany.cid?

+2

+1。 –

+0

@Sivaは私が必要とする厳密なものです。それは私にとってはあまりにも進んでいますが、それを簡素化できればいいと思います。 –

+0

ビューはすべてのクエリに使用するのに適していません。あなたが示したことのいずれかのビューのための必要は全くなく、データベースの仕組みを理解せずにこれを行うと、データベースに不要な複雑さと抽象性を追加するだけです。ビューは、初心者にも気づかなければならないものではありません。結合を書く方法を知らない人は、ビューを使用してビジネスをしていません。 – HLGEM

答えて

4

説明:あなたはInsuranceCompaniesPatientLEFT OUTERがでcid列にレコードを結合することによりのJOIN使用してテーブルを結合する必要が

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

説明:CASE式で

、クエリ状態性別フィールドの値は、それが意味するので、値1 1.値をハードコーディングされているとFカラムをを割り当てるされた場合クエリはgender = 'f'レコードと一致する1行を見つけました。これも1人を表しています。 ELSE 0を記述することもできますが、それは暗黙的なので、指定する必要はありません。このCASE式は、クエリ結果のすべてのレコードを評価します。 Finanlly、あなたは1または0のいずれかを含む女性列ですべての行を取得します。この列女性を合計すると、女性の合計数が得られます。同じ論理が男性列になります。 COALESCEと

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

Click here to view the demo in 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 

COALESCEなし:

Click here to view the demo in 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; 

出力:SQLFiddle例えば

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

これは正確で非常に正確です。これはあまりにも先進的なものです。少し簡素化できますか? –

+0

私たちはクラスでCOALESCEについて話をしませんでしたが、それを使わない方法はありますか? –

+0

thats beautifull ...ありがとう! THO 1これ以上のことは、これはデフォルトのELSEステートメントを持っていますか? :性別= 'm' THEN 1 END –

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表の各行のエントリが含まれていない表示します。 ISNULLはSQL Server用ですが、必要に応じてMySQL、Oracle用に変更することができます。

+0

SQLFiddleでコンパイルされません。 –

+0

@OfekRonは、RDBMSでコンパイルするだけです。前述のとおり、RDBMSについて言及していないので、SQL Server固有のものです。 –

+0

私はMYSQLを使用しています。 –

0

これはあなたにいくつかの助け与える必要があります -

select count(pid) as numPatients, cid, gender 
from patient 
group by cid, gender 
関連する問題