【问题标题】:Oracle Select statement calculating count from two tablesOracle Select 语句从两个表中计算计数
【发布时间】:2013-06-29 23:15:18
【问题描述】:

考虑下面的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(如果有的话)之外的其他东西。

【问题讨论】:

    标签: oracle


    【解决方案1】:

    我希望最有效的方法是使用 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;
    

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

    你为什么要把它们分开?我并不是说如果有意义就不要这样做,但也许保持相同的表结构并有视图将 US & Others 过滤掉以用于其他场景是可行的方法。

    【讨论】:

    • 改变表结构超出了我的控制或这个问题的范围。 UNION ALL 也是我的想法,而且出于某种原因,我觉得它不是最有效的方式。抱歉,我应该在我原来的问题中提到这一点。
    • 您将需要实际尝试各种解决方案,但我这样做只是为了绕过不断变化的表结构并在需要时处理性能/效率。您确实希望在两个表的联合中进行计数,因此这几乎不是不合理的方法。
    【解决方案2】:

    也许尝试按 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 列,decode 只是 case 子句的不同语法。

    希望对你有帮助,喜欢:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2011-02-18
      • 1970-01-01
      相关资源
      最近更新 更多