如何按周一、周二等工作日计算商品日均销量?技术咨询
解决方案:按工作日计算商品日均销量
你的思路完全正确——核心逻辑就是单工作日总销量 ÷ 当期该工作日的总天数,通过新增工作日计数列来实现计算是可行的。下面提供两种更高效的实现方案,你可以根据需求选择:
方案一:SQL层面直接计算(推荐,减少Excel处理负担)
直接在数据库中完成统计和计算,导出后无需在Excel中做复杂操作,适合数据量较大的场景。
修改后的SQL代码如下:
WITH DailyItemSales AS ( -- 统计每个商品、每个工作日的总销量 SELECT StockItems.Description AS 'Item', DATENAME(dw, Transactions.Date) AS 'Day', SUM(TransactionsLine.ItemQuantity) AS TotalSales FROM [IPSTransaction].[dbo].[TransactionsLine] LEFT JOIN StockItems ON TransactionsLine.StockItemID = StockItems.ID LEFT JOIN Transactions ON TransactionsLine.TransactionID = Transactions.id WHERE YEAR(Transactions.Date) = YEAR(GETDATE()) AND Transactions.TransactionTypeID = '5' GROUP BY StockItems.Description, DATENAME(dw, Transactions.Date) ), WeekdayCount AS ( -- 统计本年每个工作日的总天数 SELECT DATENAME(dw, Date) AS 'Day', COUNT(*) AS DayCount FROM ( -- 生成本年所有日期 SELECT DATEADD(day, number, DATEFROMPARTS(YEAR(GETDATE()), 1, 1)) AS Date FROM master..spt_values WHERE type = 'P' AND DATEADD(day, number, DATEFROMPARTS(YEAR(GETDATE()), 1, 1)) <= DATEFROMPARTS(YEAR(GETDATE()), 12, 31) ) AS AllDates GROUP BY DATENAME(dw, Date) ) -- 关联计算日均销量 SELECT dis.Item, dis.Day, dis.TotalSales, wc.DayCount, ROUND(CAST(dis.TotalSales AS FLOAT) / wc.DayCount, 2) AS AvgDailySales FROM DailyItemSales dis JOIN WeekdayCount wc ON dis.Day = wc.Day ORDER BY dis.Item, dis.Day;
代码说明:
DailyItemSales:按商品和工作日分组,算出每个商品在对应工作日的总销量WeekdayCount:生成本年所有日期,统计每个工作日的总天数(比如本年共有40个周一)- 最后关联两个结果集,用总销量除以对应工作日的天数,得到日均销量(保留两位小数)
方案二:Excel透视表内实现(基于你的思路优化)
如果不想修改SQL,可在现有数据基础上,通过Excel完成计算:
- 构建透视表:将
Item拖至行区域,Day拖至列区域,ItemQuantity拖至值区域并设置为求和,得到每个商品每个工作日的总销量 - 统计工作日天数:在Excel空白区域用公式统计本年每个工作日的数量,比如统计周一的天数:
(注:=SUMPRODUCT(--(TEXT(ROW(INDIRECT(DATE(YEAR(TODAY()),1,1)&":"&DATE(YEAR(TODAY()),12,31))),"aaa")="一"))"aaa"会返回中文星期简称,如"一"代表周一,可根据你的Excel语言环境调整) - 添加计算字段:在透视表中插入计算字段,公式为
日均销量 = 求和项:ItemQuantity / VLOOKUP(Day, 工作日天数表区域, 2, FALSE),通过VLOOKUP匹配对应工作日的天数完成除法计算
内容的提问来源于stack exchange,提问作者James Smith
相关产品推荐
相关产品推荐

