表GS031中应该有字段“编码”。 如果不分仓库查询:select a.仓库代码, a.编码, sum( case when 业务='入库' then 数量 else (-1)*数量 end )-isnull(期初库存,0) as 库存量 from gs01 a left join gs031 b on a.仓库代码=b.仓库代码 and a.编码=b.编码 group by a.仓库代码,a.编码,b.期初库存 分仓查询的话:select a.仓库代码, a.编码, sum(case when 业务='入库' then 数量 else (-1)*数量 end)-isnull(期初库存,0) as 库存量 from gs01 a left join ( select * from gs031 where 仓库代码=@仓库代码 ) b on a.仓库代码=b.仓库代码 and a.编码=b.编码 where a.仓库代码=@仓库代码 group by a.仓库代码,a.编码,b.期初库存
--不分仓库 select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库 ,期末数量=isnull(b.期初数量,0)+a.本期结余 from( select 编码 ,本期入库=sum(case 业务 when '入库' then 数量 else 0 end) ,本期出库=sum(case 业务 when '出库' then 数量 else 0 end) ,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end) from gs01 group by 编码 )a left join( select 编码,期初数量=sum(期初数量) from gs031 group by 编码 )b on a.编码=b.编码
--分仓库 select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库 ,期末数量=isnull(b.期初数量,0)+a.本期结余 from( select 编码,仓库代码 ,本期入库=sum(case 业务 when '入库' then 数量 else 0 end) ,本期出库=sum(case 业务 when '出库' then 数量 else 0 end) ,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end) from gs01 group by 编码,仓库代码 )a left join( select 编码,仓库代码,期初数量=sum(期初数量) from gs031 group by 编码,仓库代码 )b on a.编码=b.编码 and a.仓库代码=b.仓库代码
--测试--测试数据 create table gs031(仓库代码 char(3),编码 char(9),期初数量 int) insert gs031 select '001','001000101',300 union all select '002','001000101',400 union all select '001','001000103',3999create table gs01(仓库代码 char(3),编码 char(10),业务 char(4),数量 int) insert gs01 select '001','001000101','入库',3050 union all select '002','001000101','入库',4050 union all select '001','001000101','出库',3800 union all select '001','001000105','入库',3400 union all select '001','001000101','出库',3050 union all select '001','001000105','入库',3050 union all select '001','001000103','入库',3000 union all select '002','001000103','出库',3050 go--不分仓库 select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库 ,期末数量=isnull(b.期初数量,0)+a.本期结余 from( select 编码 ,本期入库=sum(case 业务 when '入库' then 数量 else 0 end) ,本期出库=sum(case 业务 when '出库' then 数量 else 0 end) ,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end) from gs01 group by 编码 )a left join( select 编码,期初数量=sum(期初数量) from gs031 group by 编码 )b on a.编码=b.编码--分仓库 select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库 ,期末数量=isnull(b.期初数量,0)+a.本期结余 from( select 编码,仓库代码 ,本期入库=sum(case 业务 when '入库' then 数量 else 0 end) ,本期出库=sum(case 业务 when '出库' then 数量 else 0 end) ,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end) from gs01 group by 编码,仓库代码 )a left join( select 编码,仓库代码,期初数量=sum(期初数量) from gs031 group by 编码,仓库代码 )b on a.编码=b.编码 and a.仓库代码=b.仓库代码 go--删除测试 drop table gs031,gs01/*--测试结果编码 期初数量 本期入库 本期出库 期末数量 ---------- ----------- ----------- ----------- ----------- 001000101 700 7100 6850 950 001000103 3999 3000 3050 3949 001000105 0 6450 0 6450(所影响的行数为 3 行)编码 期初数量 本期入库 本期出库 期末数量 ---------- ----------- ----------- ----------- ----------- 001000101 300 3050 6850 -3500 001000101 400 4050 0 4450 001000103 3999 3000 0 6999 001000103 0 0 3050 -3050 001000105 0 6450 0 6450(所影响的行数为 5 行) --*/
如果不分仓库查询:select a.仓库代码,
a.编码,
sum( case when 业务='入库'
then 数量
else (-1)*数量
end
)-isnull(期初库存,0) as 库存量
from gs01 a left join gs031 b on a.仓库代码=b.仓库代码 and a.编码=b.编码
group by a.仓库代码,a.编码,b.期初库存
分仓查询的话:select a.仓库代码,
a.编码,
sum(case when 业务='入库' then 数量 else (-1)*数量 end)-isnull(期初库存,0) as 库存量
from gs01 a left join
( select *
from gs031
where 仓库代码=@仓库代码
) b on a.仓库代码=b.仓库代码 and a.编码=b.编码
where a.仓库代码=@仓库代码
group by a.仓库代码,a.编码,b.期初库存
给你几个数据
gs031表:
仓库代码 编码 期初数量
001 001000101 300
002 001000101 400
001 001000103 3999
...
gs01表
仓库代码 编码 业务 数量
001 001000101 入库 3050
002 001000101 入库 4050
001 001000101 出库 3800
001 001000105 入库 3400
001 001000101 出库 3050
001 001000105 入库 3050
001 001000103 入库 3000
002 001000103 出库 3050
....
这就是数据,要求就是我刚刚说的那些,求求你们了,谢谢
库存数量=gs031 .期初库存 + GS01 业务类型='入库' .数量 - GS01 业务类型='2'. 数量
如果所查询的代码在gs031中没有,那么期初的数量就为0
库存数量=GS01 业务类型='入库' .数量 - GS01 业务类型='2'. 数量
表gs031里面
仓库代码 编码 期初数量
001 001000101 300
002 001000101 409
表gs01里面
仓库代码 编码 业务 数量
001 001000101 入库 3050
001 001000101 入库 4050
这样查出来的期初数量应该是709对吧,但它只能查出来300,这是怎么回事呢,请帮忙再看一下吧,谢谢啦
select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库
,期末数量=isnull(b.期初数量,0)+a.本期结余
from(
select 编码
,本期入库=sum(case 业务 when '入库' then 数量 else 0 end)
,本期出库=sum(case 业务 when '出库' then 数量 else 0 end)
,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end)
from gs01
group by 编码
)a left join(
select 编码,期初数量=sum(期初数量)
from gs031
group by 编码
)b on a.编码=b.编码
select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库
,期末数量=isnull(b.期初数量,0)+a.本期结余
from(
select 编码,仓库代码
,本期入库=sum(case 业务 when '入库' then 数量 else 0 end)
,本期出库=sum(case 业务 when '出库' then 数量 else 0 end)
,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end)
from gs01
group by 编码,仓库代码
)a left join(
select 编码,仓库代码,期初数量=sum(期初数量)
from gs031
group by 编码,仓库代码
)b on a.编码=b.编码 and a.仓库代码=b.仓库代码
create table gs031(仓库代码 char(3),编码 char(9),期初数量 int)
insert gs031 select '001','001000101',300
union all select '002','001000101',400
union all select '001','001000103',3999create table gs01(仓库代码 char(3),编码 char(10),业务 char(4),数量 int)
insert gs01 select '001','001000101','入库',3050
union all select '002','001000101','入库',4050
union all select '001','001000101','出库',3800
union all select '001','001000105','入库',3400
union all select '001','001000101','出库',3050
union all select '001','001000105','入库',3050
union all select '001','001000103','入库',3000
union all select '002','001000103','出库',3050
go--不分仓库
select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库
,期末数量=isnull(b.期初数量,0)+a.本期结余
from(
select 编码
,本期入库=sum(case 业务 when '入库' then 数量 else 0 end)
,本期出库=sum(case 业务 when '出库' then 数量 else 0 end)
,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end)
from gs01
group by 编码
)a left join(
select 编码,期初数量=sum(期初数量)
from gs031
group by 编码
)b on a.编码=b.编码--分仓库
select a.编码,期初数量=isnull(b.期初数量,0),a.本期入库,a.本期出库
,期末数量=isnull(b.期初数量,0)+a.本期结余
from(
select 编码,仓库代码
,本期入库=sum(case 业务 when '入库' then 数量 else 0 end)
,本期出库=sum(case 业务 when '出库' then 数量 else 0 end)
,本期结余=sum(case 业务 when '入库' then 数量 else -数量 end)
from gs01
group by 编码,仓库代码
)a left join(
select 编码,仓库代码,期初数量=sum(期初数量)
from gs031
group by 编码,仓库代码
)b on a.编码=b.编码 and a.仓库代码=b.仓库代码
go--删除测试
drop table gs031,gs01/*--测试结果编码 期初数量 本期入库 本期出库 期末数量
---------- ----------- ----------- ----------- -----------
001000101 700 7100 6850 950
001000103 3999 3000 3050 3949
001000105 0 6450 0 6450(所影响的行数为 3 行)编码 期初数量 本期入库 本期出库 期末数量
---------- ----------- ----------- ----------- -----------
001000101 300 3050 6850 -3500
001000101 400 4050 0 4450
001000103 3999 3000 0 6999
001000103 0 0 3050 -3050
001000105 0 6450 0 6450(所影响的行数为 5 行)
--*/