0

考虑下面的语句,我从&表SELECT中得到不同的计数,并得到我想要的结果。licenseelicensee_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”根据“citizen”列分为两个表,分别是“licensee_us”和“licensee_other”。两个新表都没有“citizen”列。表'licensee_us'有来自'licensee'表(citizen ='US')的记录&类似地表'licensee_other'有来自'licensee'表(citizen ='Other')的记录&这两个表都有JOIN-ing列'license_type_id ' & 列'标志'。

现在,使用 license_type_id 分组的新两个表获得与上述 SELECT 查询相同的计数的有效方法是什么?让我知道是否需要任何澄清。我真的在寻找一种“有效”的方式来做到这一点。如果有的话,除了必须使用 UNION 之外的东西。

4

2 回答 2

0

也许尝试按 licensee.license_type_id 、citizen 、 flag 分组?

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 列,解码只是 case 子句的不同语法。

我希望它对你有帮助,享受:)

于 2013-06-30T05:51:27.830 回答
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;

您可以尝试一堆子选择,但我认为它们不会特别有效。你知道你的数据,所以它可能值得一试。

你为什么要把它们分开?我并不是说如果有意义的话你不应该这样做,但也许保持相同的表结构并有视图来过滤美国和其他人以便在其他情况下使用是要走的路。

于 2013-06-30T00:11:17.850 回答