日期:2014-05-19  浏览次数:20596 次

求一Select语句,望大家帮忙
select语句不知怎写,请大家帮忙
table   :仓库凭证
field   :仓库   int,凭证号   char   ,物品   int,进出   bit,   数量   num,金额   num

Table   :库存
Field   :仓库   int,物品   int,数量   num,金额   num

求得出结果:
Sum(仓库凭证.数量)   as   进仓数量   Where   进出   =   1
Sum(仓库凭证.金额)   as   进仓金额   Where   进出   =   1
Sum(仓库凭证.数量)   as   出仓数量   Where   进出   =   0
Sum(仓库凭证.金额)   as   出仓金额   Where   进出   =   0
库存.数量   as   期末数量
库存.金额   as   期末金额

期末数量   -   进仓数量   +   出仓数量   as   期初数量
期末金额   -   进仓金额   +   出仓金额   as   期初金额

------解决方案--------------------


select
A.仓库,
A.物品,
isnull(B.数量,0)-isnull(A.进仓数量,0)+isnull(A.出仓数量,0) AS 期初数量,
isnull(B.金额,0)-isnull(A.进仓金额,0)+isnull(A.出仓金额,0) AS 期初金额,
A.进仓数量,
A.进仓金额,
A.出仓数量,
A.出仓金额,
B.数量 as 期末数量,
B.金额 as 期末金额
from (
select
仓库,
物品,
sum(case when 进出=1 then 数量 else 0 end ) as 进仓数量,
sum(case when 进出=1 then 金额 else 0 end ) as 进仓金额,
sum(case when 进出=0 then 数量 else 0 end ) as 出仓数量,
sum(case when 进出=0 then 金额 else 0 end ) as 出仓金额
from 仓库凭证
group by 仓库,物品) AS A
inner join 库存 AS B on A.仓库=B.仓库 and A.物品=B.物品
------解决方案--------------------
来一个例子:


declare @仓库凭证 table(仓库 int,凭证号 char(3) ,物品 varchar(5),进出 bit, 数量 int,金额 decimal(9,3))
insert into @仓库凭证
select '1 ', '001 ', 'B ',1,100,1000 union all
select '1 ', '002 ', 'B ',0,40,400 union all
select '1 ', '003 ', 'B ',1,50,500

declare @库存 table (仓库 int,物品 varchar(5),数量 int,金额 decimal(9,3))
insert into @库存
select '1 ', 'B ',110,1100


select tmp.仓库,tmp.物品,tmp.凭证号,
[库初数量]
=case when b.数量 <tmp.StocksSum+tmp.数量 then b.数量-tmp.StocksSum else tmp.数量 end
from
(select *,StocksSum=
isnull((select sum(case when [进出]=1 then [数量] else -[数量] end)
from @仓库凭证 where 仓库=a.仓库 and 物品=a.物品 and [凭证号]> a.[凭证号]),0),
StocksPrice=
isnull((select sum(case when [进出]=1 then [金额] else -[金额] end)
from @仓库凭证 where 仓库=a.仓库 and 物品=a.物品 and [凭证号]> a.[凭证号]),0)
from @仓库凭证 as a )tmp
right join @库存 b on tmp.仓库=b.仓库 and tmp.物品=b.物品
and b.数量 ! <tmp.StocksSum+tmp.数量


(3 行受影响)

(1 行受影响)
仓库 物品 凭证号 库初数量
----------- ----- ---- -----------
1 B 001 100
1 B 002 40
1 B 003 50

(3 行受影响)