2013-06-29 70 views
0

請考慮以下SELECT聲明,其中我從licensee & licensee_type表中得到不同的計數,並獲得我想要的結果。Oracle Select語句計算兩個表的計數

SELECT 
    licensee.license_type_id, 
    COUNT(*) AS count_all, 
    COUNT(CASE WHEN licensee.citizen = 'US' THEN 1 ELSE NULL END) AS count_a, 
    COUNT(CASE WHEN licensee.citizen = 'Other' AND licensee.flag = 'Y' THEN 1 ELSE NULL END) AS count_b, 
    COUNT(CASE WHEN licensee.flag = 'N' THEN 1 ELSE NULL END) AS count_c 
FROM licensee 
INNER JOIN license_type ON licensee.license_type_id = license_type.id 
GROUP BY licensee.license_type_id; 

場景:主表「許可」被分成兩個表說「licensee_us」和基於列「公民」 licensee_other「。新表格都沒有「公民」欄。表'licencee_us'具有來自'被許可人'表(公民='美國')的記錄&類似的表'許可證人'具有來自'被許可人'表(公民='其他')的記錄&兩個表都具有聯合列'license_type_id '&列'標誌'。

現在,什麼是有效的方式來獲得與上述SELECT查詢相同的計數與新的兩個表GROUP_ed由license_type_id?如果需要澄清,請告訴我。我真的正在尋找一種「高效」的方式來做到這一點。除了必須使用UNION之外的其他東西,如果有的話。

回答

0

我希望最有效的方法是使用UNION ALL重新組合這兩個表並按照您的要求完成查詢。出於某種原因,我得到的,這不是你想聽到什麼樣的感覺:

SELECT 
     licensee.license_type_id, 
     COUNT(*) AS count_all, 
     COUNT(CASE WHEN licensee.citizen = 'US' THEN 1 ELSE NULL END) AS count_a, 
     COUNT(CASE WHEN licensee.citizen = 'Other' AND licensee.flag = 'Y' THEN 1 ELSE NULL END) AS count_b, 
     COUNT(CASE WHEN licensee.flag = 'N' THEN 1 ELSE NULL END) AS count_c 
    FROM 
(select 'US' as citizen, licensee_us.* UNION ALL SELECT 'Other' as citizen, licensee_other.*) as licensee 
    INNER JOIN license_type ON licensee.license_type_id = license_type.id 
    GROUP BY licensee.license_type_id; 

你可以嘗試一串子選擇,但我不認爲他們會特別有效。你知道你的數據,所以它可能值得一試。

你爲什麼把它們分開?我並不是說你不應該這樣做,如果它是有道理的,但也許保持相同的表格結構和有意見過濾美國&其他情況下用於其他情況是要走的路。

+0

改變表結構是超出我的控制範圍或這個問題的範圍。 UNION ALL是我認爲也是由於某種原因,我不覺得它是最有效的方式。對不起,我應該在我原來的問題中提到這一點。 – Bala

+0

您需要真正嘗試各種解決方案,但我只是爲了解決不斷變化的表格結構,並在需要時處理性能/效率問題。你真的希望統計兩個表的聯合,所以這不是一個不合理的方法。 – LoztInSpace

0

也許嘗試按licensee.license_type_id,公民,國旗分組?

SELECT licensee.license_type_id, COUNT(*) AS count_all , count(decode(licensee.flag,'N',null) as count_c FROM licensee INNER JOIN license_type ON licensee.license_type_id = license_type.id GROUP BY licensee.license_type_id , licensee.citizen , licensee.flag;

如果有在licensee.citizen列的更多不同的值,它們進行過濾WHERE子句英寸 這樣你就可以用不同的方式得到所有想要的計數,如果你想重新排列它們,你可以使用unpivot, 注意到count_c列,decode只是case子句的不同語法。

我希望它可以幫助你,享受:)