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

曾解决的有关问题现出现新有关问题,请marco08和mengmou及各位好手再帮看看

2012-01-15 
曾解决的问题现出现新问题,请marco08和mengmou及各位好手再帮看看如下问题在http://community.csdn.net/Ex

曾解决的问题现出现新问题,请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

*/

热点排行