求一个比较复杂的数据库语句。请高手 指点。在线等
--生成测试数据: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表中,同一组的随便一列上就行
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中的一行进行分配时,需要像这样拆开吗?
--- @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