当前位置: 代码迷 >> Sql Server >> 求销售表中产品的销售速度有关问题
  详细解决方案

求销售表中产品的销售速度有关问题

热度:86   发布时间:2016-04-24 09:11:29.0
求销售表中产品的销售速度问题。
现有表结构和关系如下:
select 
 store,  outdate, c.classname8 as season  ,(a.colthno+left(a.color,2)) as SKU,  a.colthno, a.color,  nb, 
 b.Dim_Year,
 b.Dim_Week  
from 
 BI_sale a,--销售表
 BI_Dim_Date b,--日期表(里面的周定义和一般的周不一样)
 BI_Product c--产品表
where 
 a.endprice<>0 
 and a.colthno=c.colthno
 and left(a.color,2)=c.color
 and a.chflags=1 
 and a.outdate=b.DateKey


定义销售速度:
销售总数量/销售周数
--销售周数:某个产品(SKU号)从第一次有销售的周到今天所经历的周数(日期表的周数和实际日历上的周数不一样,老板自己定义的)
--比如:SKU为VE320C5100499的产品,在2014年的第31周有销售,到现在(20150205也就是2015年第5周)一个销售了
--52-31+5+1=27周(因为是要包含2014年的第31周所以+1)那么这个SKU的销售速度为
--83/27=3.07
select 
 (a.colthno+left(a.color,2)) as SKU,
 b.Dim_Week,
    b.Dim_Year
from 
 BI_sale a,
 BI_Dim_Date b
where 
 a.endprice<>0 
 and a.chflags=1 
 and a.outdate=b.DateKey
 and a.colthno+left(a.color,2)='VE320C5100499'
 order by Dim_Year,Dim_Week asc

 --当前为2015年第5周
 select DateKey,Dim_Week from BI_Dim_Date where DateKey='20150205'
 --销售总量83
 select sum(nb) from BI_sale a
 where a.colthno+left(a.color,2)='VE320C5100499' 



 问题是:要建立个视图存放每个SKU的销售速度,销售表是每天更新的。这个视图该怎么建立呢?
------解决思路----------------------
随手写出来的最多9成的正确率,余下的需要自己调试正确的。
还有第一周没过的时候销售周数是0,做除法前要把它变成1。
DECLARE @thisDay datetime
DECLARE @week INT

-- 假设0点后调用,前一天为统计日
SET @thisDay = Convert(datetime,
                       Convert(varchar(10),
                               DateAdd(day,-1,GetDate()),
                               120),
                       120)
SELECT @week = 周
  FROM BI_Dim_Date
 WHERE 日期 = @thisDay

-- 把该天的销售数量按SKU分组统计
SELECT SKU, SUM(数量) 销售数量
  INTO #daySUM
  FROM BI_sale
 WHERE outdate = @thisDay
GROUP BY SKU

-- 存在的就加到销售总数量中
UPDATE 销售速度表
   SET r.销售总数量 = r.销售总数量 + s.销售数量
  FROM 销售速度表 r, 
       #daySUM s
 WHERE r.SKU = s.SKU

-- 不存在的就新增记录
INSERT INTO 销售速度表 (SKU,开始周,销售总数量,销售周数) --原来多打了一个累积数量字段
SELECT SKU, @week, 销售数量, 0
  FROM #daySUM s
 WHERE NOT EXISTS (SELECT *
                     FROM 销售速度表 r
                    WHERE r.SKU = s.SKU)

-- 再看下日期表,该天和下一天是不是同一周,不是就所有记录的销售周数加1
IF (SELECT COUNT(DISTINCT 周) FROM BI_Dim_Date WHERE 日期 BETWEEN @thisDay AND DateAdd(day,1,@thisDay)) > 1
BEGIN
    UPDATE 销售速度表
       SET 销售周数 = 销售周数 + 1
END
  相关解决方案