按月份与30分钟间隔生成销售透视表时遇重复数据问题求助
解决按月份+30分钟间隔的销售透视表重复统计问题
嘿,我一眼就看出你这问题出在哪了!你现在的透视表每个月份都显示全年的销售数据,核心原因是子查询和pivot的分组逻辑没对齐,导致统计的时候没有把数据和对应月份绑定,反而把所有数据都算到每个月份列里了。
咱们先拆解下原代码的问题:
- 子查询只是把2017年所有数据查出来,没明确每条数据对应的时段和月份的关联关系;
- 外层的
group by只按时段分组,没有和月份联动,pivot后的每个月份列其实统计的是全时段的总数量,自然就重复了。
给你改好的代码,每一步都做了优化:
select -- 把时段转换成友好的HH:00/HH:30格式 时段 = concat(DATEPART(HOUR, hormod), case when DATEPART(MINUTE, hormod)/30 = 0 then ':00' else ':30' end), [Jan] as 一月, [Feb] as 二月, [Mar] as 三月, [Apr] as 四月 from ( select -- 生成唯一的时段标识,用来让pivot正确按30分钟间隔分组 时段标识 = concat(DATEPART(HOUR, hormod), '_', DATEPART(MINUTE, hormod)/30), -- 提取记录对应的月份 月份 = datename(month, fecalb), codalb from balbara where year(fecalb) = 2017 ) as z -- 按月份转列,统计每个时段对应月份的销售笔数 pivot( count(codalb) for 月份 in ([January],[February],[March],[April]) ) as pivotable -- 按时段排序,让结果更直观 order by 时段;
关键改动说明:
- 子查询新增时段标识:用
小时_0/1的格式生成唯一标识,确保pivot能精准按30分钟间隔分组,不会把不同时段的数据混在一起; - pivot自动完成分组聚合:pivot会自动把
时段标识作为分组依据,然后对每个分组下的不同月份统计销售数量,这样每条数据只会被统计到对应的月份和时段里; - 去掉外层多余的group by:原代码的group by会把pivot后的结果再次合并,导致重复统计,现在pivot已经完成了分组,不需要额外再group by;
- 优化列名可读性:把英文月份缩写改成中文(也可以保留英文,看你需求),结果更清晰。
这样跑出来的结果,每个时段对应的每个月份列,就只会显示该时段该月份的销售数量,不会再重复显示全年数据啦!
内容的提问来源于stack exchange,提问作者Ion
相关产品推荐
相关产品推荐

