单门店SQL销售占比查询正常,多门店查询结果异常求助
问题原因与修复方案
问题根源
你的查询在单门店时正常,多门店时结果异常,核心原因是分母的计算逻辑不符合预期:
- 单门店查询时,
sum(count(*)) over ()返回的是当前门店的总记录数,各项占比基于门店自身总数计算,结果符合预期。 - 多门店查询时,
sum(count(*)) over ()返回的是所有选中门店的总记录数之和,导致每个门店的各项占比变成「该门店某类记录数 / 所有门店总记录数」,而非你需要的「该门店某类记录数 / 该门店总记录数」,因此结果异常。
修复后的查询语句(基于门店自身总数计算占比)
SELECT storeId, -- 用当前门店的总记录数作为分母,计算自身占比 COUNT(CASE WHEN marketPlace = '0' THEN 1 END) * 100.0 / NULLIF(COUNT(storeId), 0) AS '% Venda própria', COUNT(CASE WHEN marketPlace <> '0' THEN 1 END) * 100.0 / NULLIF(COUNT(storeId), 0) AS '% Venda MktPlace', COUNT(CASE WHEN marketPlace IS NULL THEN 1 END) * 100.0 / NULLIF(COUNT(storeId), 0) AS '% NULL', COUNT(storeId) AS 'total' FROM ST_HB_Header (NOLOCK) WHERE date BETWEEN '2023-01-01' AND '2023-01-07' AND storeId IN ('904', '552') GROUP BY storeId
关键修改点说明
- 修正分母逻辑:用
COUNT(storeId)(当前门店的总记录数)替代sum(count(*)) over (),确保占比计算基于门店自身数据。 - 优化统计方式:
COUNT(CASE ... END)比SUM(CASE ...)更高效——CASE不满足条件时返回NULL,COUNT会自动忽略NULL值,直接统计符合条件的记录数。 - 避免除以0错误:
NULLIF(COUNT(storeId), 0)会在门店无记录时将分母转为NULL,避免触发除法错误。 - 保留精度:使用
100.0而非100,确保计算结果为浮点数,避免整数除法导致的精度丢失。
若需基于所有门店总记录数计算占比
如果你的实际需求是统计每个门店各类记录占所有选中门店总记录数的比例,只需调整分母为全局总记录数即可,修改后语句如下:
SELECT storeId, COUNT(CASE WHEN marketPlace = '0' THEN 1 END) * 100.0 / NULLIF(SUM(COUNT(storeId)) OVER (), 0) AS '% Venda própria', COUNT(CASE WHEN marketPlace <> '0' THEN 1 END) * 100.0 / NULLIF(SUM(COUNT(storeId)) OVER (), 0) AS '% Venda MktPlace', COUNT(CASE WHEN marketPlace IS NULL THEN 1 END) * 100.0 / NULLIF(SUM(COUNT(storeId)) OVER (), 0) AS '% NULL', COUNT(storeId) AS 'total' FROM ST_HB_Header (NOLOCK) WHERE date BETWEEN '2023-01-01' AND '2023-01-07' AND storeId IN ('904', '552') GROUP BY storeId
内容的提问来源于stack exchange,提问作者ricardinhozz
相关产品推荐
相关产品推荐

