2014-10-18 80 views
0

我有了patientnum,patientname 和insurance_cover表有patientnum,insurancecode如何從另一個表計數據

我需要顯示的患者覆蓋保險,沒有醫療保險,病人數和總人數的患者表 如何在不使用連接的情況下做到這一點?

SELECT 'WITH INSURANCE' AS '',PATIENTNUM, PATIENTSURNAME 
from PATIENT where PATIENTNUM 
IN(select PATIENTNUM from INSURANCE_COVER) 

UNION 

SELECT 'WITHOUT INSURANCE' AS '',PATIENTNUM, PATIENTSURNAME 
from PATIENT where PATIENTNUM 
NOT IN(select PATIENTNUM from INSURANCE_COVER) 

此代碼表明,隨着保險和沒有保險有.. 數據,但我不知道怎麼算的誰有保險的病人保險。

是不是我用NOT IN? 你能幫我嗎?

+0

您是否需要關於保險/沒有保險的患者數量的彙總信息? – 2014-10-18 10:19:54

+0

是的,我需要它 – youngji 2014-10-18 10:27:26

+0

你應該添加另一個'UNION'與以下'SELECT'包含'COUNT()'並且使它看起來像ie:'WITH INSURANCE AS''','TOTAL AS PATIENTNUM','' COUNT(...)AS PATIENTSURNAME' – 2014-10-18 10:30:11

回答

0
SELECT 
    'WITH INSURANCE' AS '', 
    PATIENTNUM, 
    PATIENTSURNAME, 
    (SELECT COUNT(*) FROM PATIENT tmp WHERE PATIENTNUM IN(select PATIENTNUM from INSURANCE_COVER) AND tmp.PATIENTNUM = p.PATIENTNUM) AS INSURANCES 
FROM 
    PATIENT p 
WHERE 
    PATIENTNUM IN(select PATIENTNUM from INSURANCE_COVER) 

UNION 

SELECT 
    'WITHOUT INSURANCE' AS '', 
    PATIENTNUM, 
    PATIENTSURNAME, 
    0 AS INSURANCES 
FROM 
    PATIENT 
WHERE 
    PATIENTNUM NOT IN(select PATIENTNUM from INSURANCE_COVER) 
+0

這應該使用UNION ALL,並且使用EXISTS或NOT EXISTS可能會更高效 – 2014-10-18 11:41:55

+0

這只是添加到已由其所有者編寫的代碼中。自從他發佈聯盟以來,他應該更好地瞭解他需要什麼,我不想惹惱他們。我們不知道子查詢結果的大小,所以我不會去那麼遠,並開始用EXISTS替換IN,因爲我們沒有整個案例。 – 2014-10-18 12:16:19

+0

謝謝,我明白。值得注意的是,如果UNION是多餘的,它可能在這裏是昂貴的,尤其是昂貴的。同樣,我發現IN(...)經常過度使用,因爲它不能很好地擴展,並且EXISTS是爲了這種需求而寫入語言的;我沒有看到任何理由不提這件事。 – 2014-10-18 12:25:31

相關問題