2013-06-29 45 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子句的不同语法。

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