求SQL语句

dzxccsu 2015-05-12 02:45:45
源数据表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 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

要求:
不能使用游标,可用存储过程等
逻辑说明:
根据客户,品项,日期,分公司分组,用年销回推日销
中午已经有C友回答,但不全。
...全文
102 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
还在加载中灬 2015-05-12
  • 打赏
  • 举报
回复
引用 7 楼 xxzxwsx 的回复:
[quote=引用 1 楼 ky_min 的回复:] try this
;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 客户,品项,分公司,日期
[/quote]我看到复制数据,想到交叉~~
在路上_- 2015-05-12
  • 打赏
  • 举报
回复
引用 1 楼 ky_min 的回复:
try this
;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 客户,品项,分公司,日期
dzxccsu 2015-05-12
  • 打赏
  • 举报
回复
引用 5 楼 ky_min 的回复:
[quote=引用 4 楼 dzxccsu 的回复:] [quote=引用 3 楼 xxzxwsx 的回复:] 还有设么问题?
再加2条就不对了

客户	品项	日期	分公司	日销	年销
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] 你是对的
还在加载中灬 2015-05-12
  • 打赏
  • 举报
回复
引用 4 楼 dzxccsu 的回复:
[quote=引用 3 楼 xxzxwsx 的回复:] 还有设么问题?
再加2条就不对了

客户	品项	日期	分公司	日销	年销
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楼的,也不用递归
dzxccsu 2015-05-12
  • 打赏
  • 举报
回复
引用 3 楼 xxzxwsx 的回复:
还有设么问题?
再加2条就不对了

客户	品项	日期	分公司	日销	年销
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


在路上_- 2015-05-12
  • 打赏
  • 举报
回复
还有设么问题?
在路上_- 2015-05-12
  • 打赏
  • 举报
回复

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
---------------结果------------------*/
还在加载中灬 2015-05-12
  • 打赏
  • 举报
回复
try this
;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 客户,品项,分公司,日期

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧