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

zhlym 2007-04-13 10:39:06
如下问题在
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到记事本看,谢谢
...全文
162 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhlym 2007-04-14
  • 打赏
  • 举报
回复
感受谢paoluo出手,我就知道要加group by怎也加不成功,原来是新加一句,想不汗都不行
paoluo 2007-04-14
  • 打赏
  • 举报
回复
--修改一句代碼即可

--创建测试环境,假设下列表中的数据都已经按照公司、产品汇总,即公司、产品是主键。
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

*/
zhlym 2007-04-14
  • 打赏
  • 举报
回复
顶一下,盼高手路过

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧