2012-05-01 18 views
4

數據庫SQL Fiddle如何獲取由另一列分組的給定條件的兩列數?

查詢所需:要返回婦女和年齡段的男性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列?

+2

+1 SQLFiddle例子。 –

+0

@Siva,這是我需要的確切的東西,對我來說它有點太高級了,如果你可以簡化它,我會很感激 –

+0

你應該現在學習視圖不是用於所有查詢的好技術。根本不需要查看任何顯示的東西,而只是在數據庫中添加了不必要的複雜性和抽象性,這會在不瞭解數據庫的工作原理的情況下如何做到這一點時燒燬您。意見不是初學者應該意識到的。不知道如何編寫連接的人沒有使用視圖的業務。 – HLGEM

回答

4

說明

你有InsuranceCompaniesPatient使用LEFT OUTER通過在cid列加入記錄JOIN聯接表這兩個表格也適用篩選器,以選擇年齡在和之間的患者35 (包括那些邊界值)。陳述只是簡單地檢查患者是男性還是女性,並且通過如果值匹配分配值1並且如果值不匹配則分配0來計算兩個不同的列。最後,你必須將結果按cname分組,以保險公司名稱取數。

說明關於CASE

的情況下表達時,查詢狀態WHEN性別字段值是˚F與值1的值1分配柱是硬編碼,因爲這意味着查詢發現1行匹配gender ='f'記錄,這也代表1個人。您也可以聲明ELSE 0,但它是隱式的,所以不需要指定它。這個CASE表達式針對查詢結果中的每個記錄進行評估。 Finanlly,你會得到女性專欄包含1或0的所有行。當你總結這個專欄女性,你會得到女性的總數,男性專欄的邏輯相同。

隨着COALESCE:

COALESCE這裏替換(在這種情況下零這裏)與所述第二參數的給定值的任何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; 

輸出

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

這是正確的,非常準確,這是一個太高級,我認爲,你能簡化一下嗎? –

+0

我們沒有在課堂上講過COALESCE,有沒有辦法不使用它? –

+0

這就是美麗......謝謝!還有1件事我沒有得到是這是否有默認的ELSE語句? :CASE WHEN gender ='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上編譯。如前所述,它是SQL Server特有的,因爲你沒有提到你的RDBMS。 –

+0

即時通訊使用MYSQL。 –

0

這應該給你一些幫助 -

select count(pid) as numPatients, cid, gender 
from patient 
group by cid, gender 
相關問題