麻烦乌龟大哥帮忙看一下

shirley_yue 2009-03-19 01:26:20
麻烦乌龟大哥帮忙看一下,我不知道要怎么解决比较好:
我这里模拟了一个表:(实际库中的这个表的数据很大,有上百万条的数据)
DECLARE @TMP TABLE(SN INT ,EndDate DATETIME,Num DECIMAL(18,2) )
INSERT INTO @TMP
SELECT 1,CONVERT(CHAR(10),GETDATE(),120),22 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-1,GETDATE()),120),1 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-2,GETDATE()),120),0.1 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-6,GETDATE()),120),20 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-14,GETDATE()),120),50 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-15,GETDATE()),120),25 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-26,GETDATE()),120),48 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-37,GETDATE()),120),12 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(MONTH,-3,GETDATE()),120),36 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-1,GETDATE()),120),36 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-2,GETDATE()),120),12 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-3,GETDATE()),120),22.23 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-14,GETDATE()),120),45 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-25,GETDATE()),120),22.65 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-36,GETDATE()),120),12 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(MONTH,-7,GETDATE()),120),23 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(YEAR,-1,GETDATE()),120),65

SELECT * FROM @TMP
想要得到一下的结果:
/*其中ResultDate这个字段是这样得到的:每个SN的Num值朝前取,直到数值达到100的那天的日期
SN EndDate Num ResultDate
1 2009-03-19 00:00:00.000 22.0000 2009-03-04
1 2009-03-18 00:00:00.000 1.0000 2009-02-21
1 2009-03-17 00:00:00.000 0.1000 2009-02-21
1 2009-03-13 00:00:00.000 20.0000 2009-02-21
1 2009-03-05 00:00:00.000 50.0000 2009-02-21
1 2009-03-04 00:00:00.000 25.0000 2008-12-19
1 2009-02-21 00:00:00.000 48.0000 NULL
1 2009-02-10 00:00:00.000 12.0000 NULL
1 2008-12-19 00:00:00.000 36.0000 NULL
2 2009-03-18 00:00:00.000 36.0000 2009-03-05
2 2009-03-17 00:00:00.000 12.0000 2009-02-22
2 2009-03-16 00:00:00.000 22.2300 2009-02-11
2 2009-03-05 00:00:00.000 45.0000 2008-08-19
2 2009-02-22 00:00:00.000 22.6500 2008-03-19
2 2009-02-11 00:00:00.000 12.0000 2008-03-19
2 2008-08-19 00:00:00.000 23.0000 NULL
2 2008-03-19 00:00:00.000 65.0000 NULL*/
不知道我有没有描述清楚?麻烦了!
...全文
136 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
shirley_yue 2009-03-19
  • 打赏
  • 举报
回复
我明白你们写的意思了,呵呵,谢谢 “子陌红尘” 和“乌龟”大哥啊!
dawugui 2009-03-19
  • 打赏
  • 举报
回复
DECLARE @TMP TABLE(SN INT ,EndDate DATETIME,Num DECIMAL(18,2) ) 
INSERT INTO @TMP
SELECT 1,CONVERT(CHAR(10),GETDATE(),120),22 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-1,GETDATE()),120),1 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-2,GETDATE()),120),0.1 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-6,GETDATE()),120),20 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-14,GETDATE()),120),50 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-15,GETDATE()),120),25 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-26,GETDATE()),120),48 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-37,GETDATE()),120),12 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(MONTH,-3,GETDATE()),120),36 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-1,GETDATE()),120),36 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-2,GETDATE()),120),12 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-3,GETDATE()),120),22.23 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-14,GETDATE()),120),45 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-25,GETDATE()),120),22.65 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-36,GETDATE()),120),12 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(MONTH,-7,GETDATE()),120),23 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(YEAR,-1,GETDATE()),120),65

SELECT * , case when (select sum(num) from @tmp where sn = t.sn and enddate >= t.enddate) <= 100
then (select sum(num) from @tmp where sn = t.sn and enddate >= t.enddate)
end sum_num
FROM @TMP t

/*
SN EndDate Num sum_num
----------- ------------------------------------------------------ -------------------- ----------------------------------------
1 2009-03-19 00:00:00.000 22.00 22.00
1 2009-03-18 00:00:00.000 1.00 23.00
1 2009-03-17 00:00:00.000 .10 23.10
1 2009-03-13 00:00:00.000 20.00 43.10
1 2009-03-05 00:00:00.000 50.00 93.10
1 2009-03-04 00:00:00.000 25.00 NULL
1 2009-02-21 00:00:00.000 48.00 NULL
1 2009-02-10 00:00:00.000 12.00 NULL
1 2008-12-19 00:00:00.000 36.00 NULL
2 2009-03-18 00:00:00.000 36.00 36.00
2 2009-03-17 00:00:00.000 12.00 48.00
2 2009-03-16 00:00:00.000 22.23 70.23
2 2009-03-05 00:00:00.000 45.00 NULL
2 2009-02-22 00:00:00.000 22.65 NULL
2 2009-02-11 00:00:00.000 12.00 NULL
2 2008-08-19 00:00:00.000 23.00 NULL
2 2008-03-19 00:00:00.000 65.00 NULL

(所影响的行数为 17 行)

*/
子陌红尘 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 shirley_yue 的回复:]
有一点我不是很明白哦,
(select sum(c.Num) from @TMP c where EndDate between (select top 1 EndDate from @TMP where SN=b.SN and EndDate>b.EndDate order by EndDate asc) and a.EndDate and SN=a.SN) <100

是什么意思?
[/Quote]

这个条件需要与之前的(select sum(Num) from @TMP where EndDate between b.EndDate and a.EndDate and SN=a.SN)>=100结合起来理解:

即起始日期到截止日期之间的Num取值求和大于等于100,但是起始日期的下一个日期(大于起始日期且最接近起始日期的那条记录)与截止日期之间Num取值求和小于100;目的是为了取得满足楼主条件的 ResultDate,并过滤Num和超出100之后的记录。
shirley_yue 2009-03-19
  • 打赏
  • 举报
回复
有一点我不是很明白哦,
(select sum(c.Num) from @TMP c where EndDate between (select top 1 EndDate from @TMP where SN=b.SN and EndDate>b.EndDate order by EndDate asc) and a.EndDate and SN=a.SN)<100

是什么意思?
dawugui 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shirley_yue 的回复:]
哈哈,太好了,非常感谢 “子陌红尘”大哥!
[/Quote]
OK了,那我接个分.
shirley_yue 2009-03-19
  • 打赏
  • 举报
回复
哈哈,太好了,非常感谢 “子陌红尘”大哥!
claro 2009-03-19
  • 打赏
  • 举报
回复
帮顶
子陌红尘 2009-03-19
  • 打赏
  • 举报
回复

DECLARE @TMP TABLE(SN INT ,EndDate DATETIME,Num DECIMAL(18,2) )
INSERT INTO @TMP
SELECT 1,CONVERT(CHAR(10),GETDATE(),120),22 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-1,GETDATE()),120),1 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-2,GETDATE()),120),0.1 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-6,GETDATE()),120),20 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-14,GETDATE()),120),50 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-15,GETDATE()),120),25 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-26,GETDATE()),120),48 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(DAY,-37,GETDATE()),120),12 UNION ALL
SELECT 1,CONVERT(CHAR(10),DATEADD(MONTH,-3,GETDATE()),120),36 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-1,GETDATE()),120),36 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-2,GETDATE()),120),12 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-3,GETDATE()),120),22.23 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-14,GETDATE()),120),45 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-25,GETDATE()),120),22.65 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(DAY,-36,GETDATE()),120),12 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(MONTH,-7,GETDATE()),120),23 UNION ALL
SELECT 2,CONVERT(CHAR(10),DATEADD(YEAR,-1,GETDATE()),120),65

select
a.*,b.EndDate
from
@TMP a
left join
@TMP b
on
a.SN=b.SN
and
a.EndDate>=b.EndDate
and
(select sum(Num) from @TMP where EndDate between b.EndDate and a.EndDate and SN=a.SN)>=100
and
(select sum(c.Num) from @TMP c where EndDate between (select top 1 EndDate from @TMP where SN=b.SN and EndDate>b.EndDate order by EndDate asc) and a.EndDate and SN=a.SN)<100

/*
SN EndDate Num EndDate
----------- ------------------------------------------------------ -------------------- ------------------------------------------------------
1 2009-03-19 00:00:00.000 22.00 2009-03-04 00:00:00.000
1 2009-03-18 00:00:00.000 1.00 2009-02-21 00:00:00.000
1 2009-03-17 00:00:00.000 .10 2009-02-21 00:00:00.000
1 2009-03-13 00:00:00.000 20.00 2009-02-21 00:00:00.000
1 2009-03-05 00:00:00.000 50.00 2009-02-21 00:00:00.000
1 2009-03-04 00:00:00.000 25.00 2008-12-19 00:00:00.000
1 2009-02-21 00:00:00.000 48.00 NULL
1 2009-02-10 00:00:00.000 12.00 NULL
1 2008-12-19 00:00:00.000 36.00 NULL
2 2009-03-18 00:00:00.000 36.00 2009-03-05 00:00:00.000
2 2009-03-17 00:00:00.000 12.00 2009-02-22 00:00:00.000
2 2009-03-16 00:00:00.000 22.23 2009-02-11 00:00:00.000
2 2009-03-05 00:00:00.000 45.00 2008-08-19 00:00:00.000
2 2009-02-22 00:00:00.000 22.65 2008-03-19 00:00:00.000
2 2009-02-11 00:00:00.000 12.00 2008-03-19 00:00:00.000
2 2008-08-19 00:00:00.000 23.00 NULL
2 2008-03-19 00:00:00.000 65.00 NULL
*/
shirley_yue 2009-03-19
  • 打赏
  • 举报
回复
麻烦各位好心的大哥帮忙看一下呀
shirley_yue 2009-03-19
  • 打赏
  • 举报
回复
比方说:1 2009-03-19 00:00:00.000 22.0000 2009-03-04 这天的结果是这样找的:
22.0000 +1.0000 +0.1000 +20.0000 +50.0000 +25.0000 =118.1000
那么要的日期就是 25.0000 这天的日期
htl258_Tony 2009-03-19
  • 打赏
  • 举报
回复
每个SN的Num值朝前取,直到数值达到100的那天的日期

这句话不好理解.
shirley_yue 2009-03-19
  • 打赏
  • 举报
回复
其中ResultDate这个字段是这样得到的:每个SN的Num值朝前取,直到数值达到100的那天的日期
sdhdy 2009-03-19
  • 打赏
  • 举报
回复
看不明白ResultDate 怎么得出来的?
牙签是竹子的 2009-03-19
  • 打赏
  • 举报
回复
Teng_s2000 2009-03-19
  • 打赏
  • 举报
回复
UP

34,590

社区成员

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

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