Oracle中如何基于另一表列值迭代执行SELECT统计计数?
Oracle 按国家统计非虚构类SKU数量的解决方案
嘿,针对你这个统计需求,我们完全不需要用迭代方式——Oracle的SQL本身就能高效处理这类分组统计场景。下面我给你两种常用的实现方案,你可以根据实际需求选择:
方案1:只统计有符合条件SKU的国家
这个方案会只返回存在非虚构类且带有SKU编码书籍的国家,适合你只关注有数据的国家的场景:
SELECT bci.COUNTRY_CODE, COUNT(DISTINCT bx.BOOK_ID) AS SKU_COUNT FROM BOOK_COUNTRY_INFORMATION bci INNER JOIN BOOK_MASTER bm ON bci.BOOK_ID = bm.BOOK_ID INNER JOIN BOOK_XREF bx ON bm.BOOK_ID = bx.BOOK_ID WHERE bm.BOOK_TYPE = 2 -- 筛选非虚构类书籍 AND bx.BOOK_IDENTIFIER_TYPE = 2 -- 筛选SKU编码类型 GROUP BY bci.COUNTRY_CODE ORDER BY bci.COUNTRY_CODE;
代码解释:
INNER JOIN:确保只保留同时满足三个条件的记录:属于某个国家、是非虚构类、带有SKU编码COUNT(DISTINCT bx.BOOK_ID):避免同一个书籍(BOOK_ID)被重复统计(比如一本书对应多个国家或多个SKU的情况),如果你的数据中一个BOOK_ID只对应唯一SKU,也可以换成COUNT(*)GROUP BY bci.COUNTRY_CODE:按国家分组统计数量
方案2:返回所有209个国家(含无符合条件SKU的国家)
如果你需要展示全部国家,哪怕某个国家没有符合条件的书籍(此时统计数为0),可以用LEFT JOIN来实现:
SELECT bci.COUNTRY_CODE, COUNT(DISTINCT bx.BOOK_ID) AS SKU_COUNT FROM BOOK_COUNTRY_INFORMATION bci LEFT JOIN BOOK_MASTER bm ON bci.BOOK_ID = bm.BOOK_ID AND bm.BOOK_TYPE = 2 LEFT JOIN BOOK_XREF bx ON bm.BOOK_ID = bx.BOOK_ID AND bx.BOOK_IDENTIFIER_TYPE = 2 GROUP BY bci.COUNTRY_CODE ORDER BY bci.COUNTRY_CODE;
代码解释:
LEFT JOIN:确保所有国家都被包含在结果中,即使没有匹配的书籍- 将筛选条件(
BOOK_TYPE=2和BOOK_IDENTIFIER_TYPE=2)放到JOIN的ON子句中,而不是WHERE,这样不会过滤掉没有匹配数据的国家 - 没有符合条件的国家,
SKU_COUNT会显示为0
额外注意事项
- 如果需要统计SKU的总条数(而非唯一书籍数),比如一个BOOK_ID对应多个SKU编码,就把
COUNT(DISTINCT bx.BOOK_ID)换成COUNT(bx.BOOK_IDENTIFIER) - 确保
BOOK_ID在三个表中是正确关联的,没有数据不一致的情况(比如BOOK_COUNTRY_INFORMATION中的BOOK_ID在BOOK_MASTER中不存在) - 可以根据需要调整
ORDER BY子句,比如按统计数降序排序:ORDER BY SKU_COUNT DESC
内容的提问来源于stack exchange,提问作者Fenil Dedhia
相关产品推荐
相关产品推荐

