34,590
社区成员
发帖
与我相关
我的任务
分享
客户 品项 日期 分公司 日销 年销
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 20150505 6000 6 46
客户 品项 日期 分公司 日销 年销
100 1010 20150501 6000 5 25
100 1010 20150502 6000 5 30
100 1010 20150503 6000 5 35
100 1010 20150504 6000 5 40
100 1010 20150505 6000 6 46
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
客户 品项 日期 分公司 日销 年销
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 20150505 6000 6 46
100 1010 20150509 6000 4 84
100 1010 20150510 6000 5 89
[/quote]试试我的 1楼的,也不用递归[/quote]
你是对的
客户 品项 日期 分公司 日销 年销
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 20150505 6000 6 46
100 1010 20150509 6000 4 84
100 1010 20150510 6000 5 89
[/quote]试试我的 1楼的,也不用递归
客户 品项 日期 分公司 日销 年销
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 20150505 6000 6 46
100 1010 20150509 6000 4 84
100 1010 20150510 6000 5 89
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 UNION ALL
SELECT 100, 1010, 20150505, 6000, 6, 46
), 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 1010 6000 20150505 6 46
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
---------------结果------------------*/
;WITH CTE AS(
SELECT 客户,品项,日期,分公司,日销,年销
,ROW_NUMBER()OVER(PARTITION BY 客户,品项,分公司 ORDER BY 日期)RN
FROM TB
)
,CTE2 AS(
SELECT T1.客户,T1.品项,T1.分公司,T1.日期,DATEDIFF(DAY,T1.日期,T2.日期)-1 DayNum,T1.年销,T2.年销-T2.日销-T1.年销 Diff
FROM CTE T1
JOIN CTE T2 ON T1.RN=T2.RN-1 AND T1.客户=T2.客户 AND T1.品项=T2.品项 AND T1.分公司=T2.分公司
)
SELECT 客户,品项,日期,分公司,日销,年销 FROM TB
UNION ALL
SELECT T1.客户,T1.品项,CONVERT(VARCHAR(8),DATEADD(DAY,T2.number+1,T1.日期),112),T1.分公司,T1.Diff/T1.DayNum,(T2.number+1)*(T1.Diff/T1.DayNum)+T1.年销
FROM CTE2 T1 JOIN master..spt_values T2 ON T2.type='P'AND T2.number<T1.DayNum
ORDER BY 客户,品项,分公司,日期