急!急!急!希望能用最优的sql语句来实现 20wlsr2004]

发布时间:2016-12-11 21:58:46 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"急!急!急!希望能用最优的sql语句来实现 20wlsr2004]",主要涉及到急!急!急!希望能用最优的sql语句来实现 20wlsr2004]方面的内容,对于急!急!急!希望能用最优的sql语句来实现 20wlsr2004]感兴趣的同学可以参考一下。

表A中的数据为32条,表N中的数据为17万条  如果  A表里面的记录为  h,Y  A 1.7  B 0.1  n表里面的字段有   h  l  y    z  A  2  0.1  222  A  3  0.5  333  A  4  0.6  111  A  22 0.8  666  B  5  1    555  B  11 0.2  777   得到的结果为  n_back表中  h    l    y    z  A    2    0.1  222  A    22  0.8  666  A    4    0.6  111  A    3    0.2  333  B    5    0.1  555  n表中  h    l    y    z  B    5  0.9  555  A    3  0.3  333  B    11  0.2  777  A表有字段h和y,h是一个字符型 y是一个浮点型,A是一个总表,n表是A表的一个明细表,是将A与n表中h字段相同的数据移到n_ngkc表中,但是数据要管制同一个h字段的累计y的量不能大于A表中y的量,只能是小于或等于,大于部份存在n表中,因为n表中的数据量较多,有17万,所以请希望能有最优的代码来实现

游标。

http://topic.csdn.net/u/20091005/16/bfbd2227-afd9-45c7-9903-f7a17943f0b0.html?25027

你发重复了吧?

引用 2 楼 dawugui 的回复:http://topic.csdn.net/u/20091005/16/bfbd2227-afd9-45c7-9903-f7a17943f0b0.html?25027 如果用游标实现的话,因为数据量比较多,执行时间就会长,希望能用批处理的方法来代替游标

--不就10几万条记录嘛,游标执行应该会很快的!

用连接查询,并且在h字段上建立索引,还有你那个n表y字段累计和不能大于A表,它有多种组合,你怎么确定到底是哪些行?比如1.1你怎么就知道要分成0.9和0.2呢?难道其他的分解不行吗?

--不知这样是否满足要求 DECLARE @TA TABLE([H] VARCHAR(1), [Y] DECIMAL(10,1)) INSERT @TA  SELECT 'A', 1.7 UNION ALL  SELECT 'B', 0.1 DECLARE @TB TABLE([H] VARCHAR(1), [L] INT, [Y] DECIMAL(10,1), [Z] INT) INSERT @TB  SELECT 'A', 2, 0.1, 222 UNION ALL  SELECT 'A', 3, 0.5, 333 UNION ALL  SELECT 'A', 4, 0.6, 111 UNION ALL  SELECT 'A', 22, 0.8, 666 UNION ALL  SELECT 'B', 5, 1, 555 UNION ALL  SELECT 'B', 11, 0.2, 777 SELECT A.H AS H,A.Y AS YA,B.L,B.Y AS YB,Z,YY=0.0 INTO # FROM @TA AS A JOIN @TB AS B   ON A.H=B.H CREATE CLUSTERED INDEX IDX_H ON #(H) DECLARE @TOTAL DECIMAL(10,1), @H VARCHAR(1) UPDATE #     SET @TOTAL=CASE WHEN @H=H THEN  @TOTAL+YB ELSE YB END,             @H=H,             YY=CASE WHEN @TOTAL<=YA THEN 0 ELSE CASE WHEN @TOTAL-YB>YA THEN YB ELSE @TOTAL-YA END END,             YB=CASE WHEN @TOTAL<=YA THEN YB ELSE CASE WHEN @TOTAL-YB>YA THEN 0 ELSE YA-(@TOTAL-YB) END END --SELECT * FROM # SELECT H,L,YB,Z FROM # WHERE YB<>0 SELECT H,L,YY,Z FROM # WHERE YY<>0 DROP TABLE # /* H    L           YB           Z            ---- ----------- ------------ -----------  A    2           .1           222 A    3           .5           333 A    4           .6           111 A    22          .5           666 B    5           .1           555 (5 row(s) affected) H    L           YY   Z            ---- ----------- ---- -----------  A    22          .3   666 B    5           .9   555 B    11          .2   777 (3 row(s) affected) */

帮顶~~

CREATE TABLE a(h VARCHAR(2), y NUMERIC(3,1)); INSERT INTO a(h,y) SELECT 'A', 1.7 UNION ALL SELECT 'B', 0.1; CREATE TABLE n(h VARCHAR(2), l INT, y NUMERIC(3,1), z INT); INSERT INTO n(h,l,y,z) SELECT 'A',2,0.1,222 UNION ALL SELECT 'A',3,0.5,333 UNION ALL SELECT 'A',4,0.6,111 UNION ALL SELECT  'A',22,0.8,666 UNION ALL SELECT  'B',5,1,555 UNION ALL SELECT  'B',11,0.2,777;  CREATE TABLE n_back(h VARCHAR(2), l INT, y NUMERIC(3,1), z INT); ------------------------------------------------------------------------------------ ALTER PROC test_up_a_n AS /* EXEC test_up_a_n */ BEGIN DECLARE @Id INT, @h VARCHAR(2), @h2 VARCHAR(2), @l INT, @y NUMERIC(3,1), @z INT, @a_y NUMERIC(3,1), @flag INT DECLARE @sum_y NUMERIC(3,1), @save_id INT SET @sum_y=0 CREATE TABLE #n_temp1(Id INT IDENTITY(1,1), h VARCHAR(2), l INT, y NUMERIC(3,1), z INT, a_y NUMERIC(3,1), flag INT DEFAULT 0); INSERT INTO #n_temp1(h, l, y, z, a_y) SELECT n.h, n.l, n.y, n.z, a.y FROM n LEFT JOIN a ON a.h=n.h ORDER BY n.h ASC, n.y DESC; CREATE TABLE #n_back(Id INT, h VARCHAR(2), l INT, y NUMERIC(3,1), z INT); --游标检索 DECLARE @MyData CURSOR  SET @MyData = CURSOR FOR  SELECT Id, h, l, y, z, a_y, flag from #n_temp1; OPEN @MyData FETCH NEXT FROM  @MyData INTO @Id, @h, @l, @y, @z, @a_y WHILE @@FETCH_STATUS = 0  BEGIN IF(@h2<>@h) [email protected][email protected]_y清零,从头开始累加计数 BEGIN SET @[email protected] SET @sum_y=0 END IF(@[email protected]<[email protected]_y)  [email protected][email protected],不会超出A表中的y值时,[email protected]@sum_y BEGIN INSERT INTO #n_back(Id, h, l, y, z) VALUES(@Id, @h, @l, @y, @z) SET @[email protected][email protected] END ELSE     [email protected][email protected],将要超出A表中的y值时,标记记录行,[email protected][email protected] BEGIN UPDATE #n_temp1 SET flag=1 WHERE [email protected] END FETCH NEXT FROM  @MyData INTO @Id, @h, @l, @y, @z, @a_y END  CLOSE @MyData  DEALLOCATE @MyData  CREATE TABLE #n(Id INT, h VARCHAR(2), l INT, y NUMERIC(3,1), z INT, a_y NUMERIC(3,1),sum_y NUMERIC(3,1)); INSERT INTO #n(Id, h, l, y, z, a_y, sum_y) SELECT a.Id, a.h, a.l, a.y, a.z, a.a_y, b.sum_y FROM #n_temp1 a LEFT JOIN (SELECT h, SUM(y) sum_y FROM #n_back GROUP BY h) b ON a.h=b.h  WHERE a.flag=1 INSERT INTO #n_back(Id, h, l, y, z) SELECT Id, h, l, a_y-ISNULL(sum_y,0),z FROM #n n WHERE n.Id IN ( SELECT MIN(ID) FROM #n GROUP BY h ); UPDATE #n SET y=(y-(a_y-ISNULL(sum_y,0))) WHERE ID IN ( SELECT MIN(ID) FROM #n GROUP BY h ); SELECT h, l, y, z FROM #n_back order by Id; SELECT h, l, y, z FROM #n order by h DROP TABLE #n_temp1, #n_back, #n; END

有偿支持,性能保证

引用 5 楼 luoyoumou 的回复:--不就10几万条记录嘛,游标执行应该会很快的! 因为有二层游标,所以运行下来会超慢,要一个半小时

引用 10 楼 luckyrandom 的回复:有偿支持,性能保证 你说吧,

--悲哀,漠视我上面写的代码,楼主都懒得去试试

引用 13 楼 luoyoumou 的回复:--悲哀,漠视我上面写的代码,楼主都懒得去试试 抱歉,呵,呵,要先谢谢您的帮忙,我有试过了,会出错,我有在另一边给你留言了..

把出错提示贴出来 我来修改一下 我现在没有机器调试

看看

上一篇:什么是Internet与数据库应用技术? 10分,无满意结帖,结帖人doudouliyouqiang]
下一篇:解析SQL Server 2008的商業智能 0mingjunwang]

相关文章

相关评论