当前位置: 代码迷 >> Sql Server >> 求大神SQL语句,该如何解决
  详细解决方案

求大神SQL语句,该如何解决

热度:98   发布时间:2016-04-24 09:06:30.0
求大神SQL语句
表T数据:
客户	品项	日期	分公司	日销	年销
100 1010 20150501 6000 5 25
100 1010 20150504 6000 5 40
101 1010 20150501 6150 10 100
101 1011 20150501 6150 5 50
101 1010 20150506 6150 30 230
100 1011 20150503 6000 15 60

想要得到的数据:
客户	品项	日期	分公司	日销	年销
100 1010 20150501 6000 5 25
100 1010 20150502 6000 5 30
100 1010 20150503 6000 5 35
100 1010 20150504 6000 5 40
101 1010 20150501 6150 10 100
101 1010 20150502 6150 25 125
101 1010 20150503 6150 25 150
101 1010 20150504 6150 25 175
101 1010 20150505 6150 25 200
101 1011 20150501 6150 5 50
101 1010 20150506 6150 30 230
100 1011 20150503 6000 15 60

要求:
不能使用游标,可用存储过程等
逻辑说明:
根据客户,品项,日期,分公司分组,用年销回推日销

------解决思路----------------------
引用:
Quote: 引用:

结果中 第二行 “100    1010    20150502    6000    5    30” 是按什么逻辑生成的?

第一行的年销+第二行的日销=第二行的年销 


客户    品项    日期    分公司    日销    年销
100    1010    20150501    6000    5    25
100    1010    20150504    6000    5    40


100    1010    20150502    6000    5    30
可是日期为什么是“20150502”,把逻辑一次写清楚好吗
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

结果中 第二行 “100    1010    20150502    6000    5    30” 是按什么逻辑生成的?

第一行的年销+第二行的日销=第二行的年销 


客户    品项    日期    分公司    日销    年销
100    1010    20150501    6000    5    25
100    1010    20150504    6000    5    40


100    1010    20150502    6000    5    30
可是日期为什么是“20150502”,把逻辑一次写清楚好吗


楼主的意思是5.1 到5.4 之间年销从25 变到 40, 那么 这之间有3 天,要去除5.4 号这一天已知的日销5,那么也就是40-5-25 =10 均摊到未知销售量的每一天(5.2号和5.3号)(40-5-25)/2=5.
所以中间的5.2, 5.3,的销售量为5, 年销是一个累计的概念,所以5.2好的的年销为5+25=30。


------解决思路----------------------
修正

with t(客户, 品项, 日期, 分公司, 日销, 年销) AS
(
  SELECT 100, 1010, 20150501, 6000, 5, 25 UNION ALL
  SELECT 100, 1010, 20150504, 6000, 5, 40 UNION ALL
  SELECT 101, 1010, 20150501, 6150, 10, 100 UNION ALL
  SELECT 101, 1011, 20150501, 6150, 5, 50 UNION ALL
  SELECT 101, 1010, 20150506, 6150, 30, 230 UNION ALL
  SELECT 100, 1011, 20150503, 6000, 15, 60
), t1(客户, 品项, 分公司, 起始日期, 结束日期) AS
(
  SELECT 客户, 品项, 分公司, MIN(日期), MAX(日期)
  FROM t
  GROUP BY 客户, 品项, 分公司
), t2 AS
(
  SELECT t1.客户, t1.品项, t1.分公司, t1.起始日期, t1.结束日期
    , t.日销 起始日销, t.年销 起始年销
    , tt.日销 结束日销, tt.年销 结束年销
  FROM t1 JOIN t ON t1.客户=t.客户
        AND t1.品项=t.品项
        AND t1.分公司=t.分公司
        AND t1.起始日期=t.日期
    JOIN t AS tt ON t1.客户=tt.客户
        AND t1.品项=tt.品项
        AND t1.分公司=tt.分公司
        AND t1.结束日期=tt.日期
), t3 AS
(
  SELECT 客户, 品项, 分公司
    , 起始日期 日期, 起始日销 日销, 起始年销 年销
  FROM t2
  UNION ALL
  SELECT t2.客户, t2.品项, t2.分公司
    , t3.日期+1
    , (t2.结束年销-t2.结束日销-t2.起始年销)/(t2.结束日期-t2.起始日期-1)
    , t3.年销+(t2.结束年销-t2.结束日销-t2.起始年销)/(t2.结束日期-t2.起始日期-1)
  FROM t3 JOIN t2 ON t3.客户=t2.客户 AND t3.品项=t2.品项 AND t3.分公司=t2.分公司
  WHERE (结束日期-起始日期)>2 AND t3.日期<t2.结束日期-1
)
SELECT 客户, 品项, 分公司, 日期, 日销, 年销
FROM t3
UNION ALL
SELECT 客户, 品项, 分公司
  , 结束日期 日期, 结束日销 日销, 结束年销 年销
FROM t2
WHERE 结束日期>起始日期
ORDER BY 客户, 品项, 分公司, 日期

/*----------------结果-----------------
客户 品项 分公司 日期 日销 年销
100 1010 6000 20150501 5 25
100 1010 6000 20150502 5 30
100 1010 6000 20150503 5 35
100 1010 6000 20150504 5 40
100 1011 6000 20150503 15 60
101 1010 6150 20150501 10 100
101 1010 6150 20150502 25 125
101 1010 6150 20150503 25 150
101 1010 6150 20150504 25 175
101 1010 6150 20150505 25 200
101 1010 6150 20150506 30 230
101 1011 6150 20150501 5 50
---------------结果------------------*/
  相关解决方案