首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

比较复杂的数据库语句。请高手 指点

2012-04-02 
求一个比较复杂的数据库语句。请高手 指点。在线等SQL code--生成测试数据:declare @a table (a int ,flag v

求一个比较复杂的数据库语句。请高手 指点。在线等

SQL code
--生成测试数据:declare @a table (a int ,flag varchar(20),n int)declare @b table (a int,flagmt varchar(20),m int)insert @aselect 1,'lbl1',10union allselect 1,'lbl2',25union allselect 2,'lbl3',20select * from @aa           flag                 n           ----------- -------------------- ----------- 1           lbl1                 101           lbl2                 252           lbl3                 20insert @bselect 1,'seq1',10union allselect 1,'seq2',20union allselect 1,'seq3',30union allselect 2,'seq1',6union allselect 2,'seq2',10select * from @ba           flagmt               m           ----------- -------------------- ----------- 1           seq1                 101           seq2                 201           seq3                 302           seq1                 62           seq2                 10--我想得到的结果:                                  ----------- ---- ---- ----------- 1           lbl1  seq1  101           lbl2  seq2  201           lbl2  seq3  52           lbl3  seq1  62           lbl3  seq2  14简单分析下:参照@a表的a列,a列相同的为一组从上到下和@b表中去比较。第一条比完了,比较第二条,。。注:如果@a表中按照a列分组的 n的和 比 @b中大的话,比较完后,把大的那一部分值加到@b表中,同一组的随便一列上就行


[解决办法]
顶起来
[解决办法]
是这个嘛?很麻烦
SQL code
declare @a table (a int ,flag varchar(20),n int)declare @b table (a int,flagmt varchar(20),m int)insert @aselect 1,'lbl1',10 union allselect 1,'lbl2',25 union allselect 2,'lbl3',20insert @bselect 1,'seq1',10 union allselect 1,'seq2',20 union allselect 1,'seq3',30 union allselect 2,'seq1',6 union allselect 2,'seq2',10;with t1 as(select rn=row_number()over(partition by a order by flag),* from @a),t2 as(select rn=row_number()over(partition by a order by flagmt),* from @b)select t2.a,isnull(t1.flag,(select max(flag) from t1 t where t.a=t2.a)),t2.flagmt,(case when t1.a is null then (select sum(n) from t1 where a=t2.a)-(select sum(m) from t2 t where t.a=t2.a and t.rn in(select rn from t1 o where o.a=t.a)) else t2.m end ) from t1 right join  t2 on t1.rn=t2.rn and t1.a=t2.a/*a                                flagmt                           ----------- -------------------- -------------------- ----------- 1           lbl1                 seq1                 101           lbl2                 seq2                 201           lbl2                 seq3                 52           lbl3                 seq1                 62           lbl3                 seq2                 14(所影响的行数为 5 行)*/
[解决办法]
看不懂~~~~
[解决办法]
太强大了,,我也没看懂了。。。哎。。
[解决办法]
还有一个疑问,如果@a中的第一条改为8,即不够对@b中的一行进行分配时,需要像这样拆开吗?
SQL code
--- @aa           flag                 n           ----------- -------------------- ----------- 1           lbl1                 8             -- 10 改为 81           lbl2                 252           lbl3                 20--- @ba           flagmt               m           ----------- -------------------- ----------- 1           seq1                 101           seq2                 201           seq3                 302           seq1                 62           seq2                 10-- 结果            ----------- ---- ---- ----------- 1           lbl1  seq1  81           lbl2  seq1  21           lbl2  seq2  201           lbl2  seq3  32           lbl3  seq1  62           lbl3  seq2  14 

热点排行
Bad Request.