请考虑以下SELECT
声明,其中我从licensee
& licensee_type
表,我得到了我想要的结果。
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”和“#39; licensee_us'和' licensee_other'基于公民'栏目。这两张新表都没有“公民”和“公民”。柱。表' licensee_us'有来自'被许可人的记录'表(公民='美国')&类似表格'licensee_other'有来自'被许可人的记录'表(公民='其他')&这两个表都有JOIN-ing列' license_type_id' &安培;专栏'标记'。
现在,使用由license_type_id新建的两个表GROUP-ed获得与上述SELECT查询相同计数的高效方法是什么?如果需要澄清,请告诉我。我真的在寻找一个有效率的'这样做的方式。除了必须使用UNION之外的其他东西,如果有的话。
答案 0 :(得分: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;
你可以尝试一些次选,但我不认为它们会特别有效。你知道你的数据,所以值得一试。
你为什么把它们分开?我不是说你不应该这样做,如果它有意义,但也许保持相同的表结构和观点来过滤美国和美国在其他场景中使用的其他人是要走的路。
答案 1 :(得分: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子句的不同语法。
我希望它能帮助你,享受:)