曾解决的问题现出现新问题,请marco08和mengmou及各位好手再帮看看
如下问题在
http://community.csdn.net/Expert/topic/5404/5404149.xml?temp=.3727991
得到mengmou和marco08的帮助本已解决,但现在出新情况,
就是MaInfo表会出现两个相同的记录时要把它们的值累加(如可口可乐),一旦出现这种情况目前的计算已不准确,小弟材疏,请大家再指点
--创建测试环境,假设下列表中的数据都已经按照公司、产品汇总,即公司、产品是主键。
create table Info(Code int,IncDes varchar(10))
create table MaInfo(Code int,Barcode varchar(10),MaterialsCn varchar(10),number int)
create table SaleDetail(Code int,Barcode varchar(10),MaterialsCn varchar(10),sellnum1 int)
create table SaleOrder(Code int,Barcode varchar(10),MaterialsCn varchar(10),sellnum2 int)
--插入测试数据
insert Info(Code,IncDes)
select '1009 ', '天染公司 ' union all
select '1005 ', '海丰公司 ' union all
select '1023 ', '采诗公司 '
insert MaInfo(Code,Barcode,MaterialsCn,number)
select '1009 ', '1111111 ', '可口可乐 ', '10 ' union all
select '1009 ', '1111111 ', '可口可乐 ', '10 ' union all
select '1009 ', '1111112 ', '芬达可乐 ', '12 ' union all
select '1009 ', '1111113 ', '花生果 ', '15 ' union all
select '1005 ', '1111112 ', '芬达可乐 ', '20 ' union all
select '1005 ', '1111114 ', '出前一丁 ', '30 ' union all
select '1023 ', '1111112 ', '芬达可乐 ', '22 ' union all
select '1005 ', '1111113 ', '花生果 ', '40 '
insert SaleDetail(Code,Barcode,MaterialsCn,sellnum1)
select '1009 ', '1111111 ', '可口可乐 ', '2 ' union all
select '1005 ', '1111114 ', '出前一丁 ', '3 ' union all
select '1023 ', '1111112 ', '芬达可乐 ', '1 '
insert SaleOrder(Code,Barcode,MaterialsCn,sellnum2)
select '1009 ', '1111111 ', '可口可乐 ', '2 ' union all
select '1023 ', '1111112 ', '芬达可乐 ', '1 '
--求解过程
declare @ztdm varchar(20)
set @ztdm = ' ' '1005 ' ', ' '1009 ' ' '
exec( '
declare @sql varchar(8000)
select @sql = ' 'select barcode,MaterialsCn ' '
select @sql = @sql + ' ',sum(case when IncDes = ' ' ' ' ' ' + IncDes
+ ' ' ' ' ' ' then sellnum else 0 end) as ' ' + IncDes + ' '销量 ' '
+ ' ',sum(case when IncDes = ' ' ' ' ' ' + IncDes
+ ' ' ' ' ' ' then number else 0 end) as ' ' + IncDes + ' '库存 ' '
from info where convert(varchar(20),code) in ( '+@ztdm+ ')
select @sql = @sql + ' ',sum(sellnum) as 总销量,sum(number) as 总库存
from (
select _m.code,_i.IncDes,_m.barcode,_m.MaterialsCn
,min(number) as number,isnull(sum(num),0) as sellnum
from MaInfo _m
full join(
select Code,Barcode,MaterialsCn,sellnum1 as num
from SaleDetail
union all
select Code,Barcode,MaterialsCn,sellnum2
from SaleOrder
) _s on _s.code = _m.code and _s.barcode = _m.barcode
join info _i on _i.code = _m.code
group by _m.code,_m.barcode,_m.MaterialsCn,_i.IncDes) _x
group by barcode,MaterialsCn order by barcode ' '
exec(@sql)
')
--删除测试环境
drop table Info,MaInfo,SaleDetail,SaleOrder
/*--测试结果
barcode MaterialsCn 天染公司销量 天染公司库存 海丰公司销量 海丰公司库存 总销量 总库存
1111111 可口可乐 4 10 0 0 4 10
1111112 芬达可乐 0 12 0 20 2 54
1111113 花生果 0 15 0 40 0 55
1111114 出前一丁 0 0 3 30 3 30
*/
如上结果是错的,正确的结果如下
barcode MaterialsCn 天染公司销量 天染公司库存 海丰公司销量 海丰公司库存 总销量 总库存
1111111 可口可乐 4 20 0 0 4 20
1111112 芬达可乐 0 12 0 20 2 54
1111113 花生果 0 15 0 40 0 55
1111114 出前一丁 0 0 3 30 3 30
结果在此排得不整齐,请COPY到记事本看,谢谢
[解决办法]
--修改一句代碼即可
--创建测试环境,假设下列表中的数据都已经按照公司、产品汇总,即公司、产品是主键。
create table Info(Code int,IncDes varchar(10))
create table MaInfo(Code int,Barcode varchar(10),MaterialsCn varchar(10),number int)
create table SaleDetail(Code int,Barcode varchar(10),MaterialsCn varchar(10),sellnum1 int)
create table SaleOrder(Code int,Barcode varchar(10),MaterialsCn varchar(10),sellnum2 int)
--插入测试数据
insert Info(Code,IncDes)
select '1009 ', '天染公司 ' union all
select '1005 ', '海丰公司 ' union all
select '1023 ', '采诗公司 '
insert MaInfo(Code,Barcode,MaterialsCn,number)
select '1009 ', '1111111 ', '可口可乐 ', '10 ' union all
select '1009 ', '1111111 ', '可口可乐 ', '10 ' union all
select '1009 ', '1111112 ', '芬达可乐 ', '12 ' union all
select '1009 ', '1111113 ', '花生果 ', '15 ' union all
select '1005 ', '1111112 ', '芬达可乐 ', '20 ' union all
select '1005 ', '1111114 ', '出前一丁 ', '30 ' union all
select '1023 ', '1111112 ', '芬达可乐 ', '22 ' union all
select '1005 ', '1111113 ', '花生果 ', '40 '
insert SaleDetail(Code,Barcode,MaterialsCn,sellnum1)
select '1009 ', '1111111 ', '可口可乐 ', '2 ' union all
select '1005 ', '1111114 ', '出前一丁 ', '3 ' union all
select '1023 ', '1111112 ', '芬达可乐 ', '1 '
insert SaleOrder(Code,Barcode,MaterialsCn,sellnum2)
select '1009 ', '1111111 ', '可口可乐 ', '2 ' union all
select '1023 ', '1111112 ', '芬达可乐 ', '1 '
--求解过程
declare @ztdm varchar(20)
set @ztdm = ' ' '1005 ' ', ' '1009 ' ' '
exec( '
declare @sql varchar(8000)
select @sql = ' 'select barcode,MaterialsCn ' '
select @sql = @sql + ' ',sum(case when IncDes = ' ' ' ' ' ' + IncDes
+ ' ' ' ' ' ' then sellnum else 0 end) as ' ' + IncDes + ' '销量 ' '
+ ' ',sum(case when IncDes = ' ' ' ' ' ' + IncDes
+ ' ' ' ' ' ' then number else 0 end) as ' ' + IncDes + ' '库存 ' '
from info where convert(varchar(20),code) in ( '+@ztdm+ ')
select @sql = @sql + ' ',sum(sellnum) as 总销量,sum(number) as 总库存
from (
select _m.code,_i.IncDes,_m.barcode,_m.MaterialsCn
,min(number) as number,isnull(sum(num),0) as sellnum
from (select code, barcode, MaterialsCn, SUM(number) As number From MaInfo Group By code, barcode, MaterialsCn) _m
full join(
select Code,Barcode,MaterialsCn,sellnum1 as num
from SaleDetail
union all
select Code,Barcode,MaterialsCn,sellnum2
from SaleOrder
) _s on _s.code = _m.code and _s.barcode = _m.barcode
join info _i on _i.code = _m.code
group by _m.code,_m.barcode,_m.MaterialsCn,_i.IncDes) _x
group by barcode,MaterialsCn order by barcode ' '
exec(@sql)
')
--删除测试环境
drop table Info,MaInfo,SaleDetail,SaleOrder
/*--测试结果
barcode MaterialsCn 天染公司销量 天染公司库存 海丰公司销量 海丰公司库存 总销量 总库存
1111111 可口可乐 4 20 0 0 4 20
1111112 芬达可乐 0 12 0 20 2 54
1111113 花生果 0 15 0 40 0 55
1111114 出前一丁 0 0 3 30 3 30
*/