日期:2014-05-18  浏览次数:20561 次

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

declare @b table (a int,flagmt varchar(20),m int)


insert @a
select 1,'lbl1',10
union all
select 1,'lbl2',25
union all
select 2,'lbl3',20

select * from @a
a           flag                 n           
----------- -------------------- ----------- 
1           lbl1                 10
1           lbl2                 25
2           lbl3                 20


insert @b
select 1,'seq1',10
union all
select 1,'seq2',20
union all
select 1,'seq3',30
union all
select 2,'seq1',6
union all
select 2,'seq2',10

select * from @b
a           flagmt               m           
----------- -------------------- ----------- 
1           seq1                 10
1           seq2                 20
1           seq3                 30
2           seq1                 6
2           seq2                 10

--我想得到的结果:
                                  
----------- ---- ---- ----------- 
1           lbl1  seq1  10
1           lbl2  seq2  20
1           lbl2  seq3  5
2           lbl3  seq1  6
2           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 @a
select 1,'lbl1',10 union all
select 1,'lbl2',25 union all
select 2,'lbl3',20

insert @b
select 1,'seq1',10 union all
select 1,'seq2',20 union all
select 1,'seq3',30 union all
select 2,'seq1',6 union all
select 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                 10
1           lbl2                 seq2                 20
1           lbl2                 seq3                 5
2           lbl3                 seq1                 6
2           lbl3                 seq2                 14

(所影响的行数为 5 行)*/

------解决方案--------------------
看不懂~~~~
------解决方案--------------------
太强大了,,我也没看懂了。。。哎。。
------解决方案--------------------
还有一个疑问,如果@a中的第一条改为8,即不够对@b中的一行进行分配时,需要像这样拆开吗?
SQL code
--- @a
a           flag                 n           
----------- -------------------- ----------- 
1           lbl1                 8             -- 10 改为 8
1           lbl2                 25
2           lbl3                 20

--- @b

a           flagmt               m           
----------- -------------------- ----------- 
1           seq1                 10
1           seq2                 20
1           seq3                 30
2           seq1                 6
2           seq2                 10

-- 结果            
----------- ---- ---- ----------- 
1           lbl1  seq1  8
1           lbl2  seq1  2
1           lbl2  seq2  20
1           lbl2  seq3  3
2           lbl3  seq1  6
2           lbl3  seq2  14