只能具体问题具体分析.比如,一个简单的进出库表的设计:
--库存统计示例:--数据测试环境
create table 物料明细表(物料ID varchar(6) primary key
,名称 varchar(8) not null
,规格 varchar(10)
,颜色 varchar(4)
,单位 varchar(4)
,所属类别 varchar(6))create table 进仓主表 (进仓ID varchar(20) primary key
,供应商ID varchar(10)
,进仓日期 datetime
,原凭证号 varchar(10)
,入库类型 int)create table 进仓明细表 (进仓ID varchar(20) not null
,物料ID varchar(6) not null
,数量 decimal(20,2))alter table 进仓明细表 add constraint PK_进仓明细表 PRIMARY KEY CLUSTERED (进仓ID,物料ID)create table 出仓主表 (出仓ID varchar(20) primary key
,部门ID varchar(10)
,领料日期 datetime
,领料单号 varchar(10)
,出库类型 varchar(1))create table 出仓明细表 (出仓ID varchar(20) not null
,物料ID varchar(6) not null
,数量 decimal(20,2))
alter table 出仓明细表 add constraint PK_出仓明细表 PRIMARY KEY CLUSTERED (出仓ID,物料ID)
go--添加表间关系
ALTER TABLE dbo.进仓明细表 ADD CONSTRAINT FK_进仓明细表_进仓主表 FOREIGN KEY
(进仓ID) REFERENCES dbo.进仓主表(进仓ID) 
 ON UPDATE CASCADE
 ON DELETE CASCADEALTER TABLE dbo.进仓明细表 ADD CONSTRAINT FK_进仓明细表_物料明细表 FOREIGN KEY
(物料ID) REFERENCES dbo.物料明细表(物料ID) 
 ON UPDATE CASCADE
 ON DELETE CASCADEALTER TABLE dbo.出仓明细表 ADD CONSTRAINT FK_出仓明细表_出仓主表 FOREIGN KEY
(出仓ID) REFERENCES dbo.出仓主表(出仓ID) 
 ON UPDATE CASCADE
 ON DELETE CASCADEALTER TABLE dbo.出仓明细表 ADD CONSTRAINT FK_出仓明细表_物料明细表 FOREIGN KEY
(物料ID) REFERENCES dbo.物料明细表(物料ID) 
 ON UPDATE CASCADE
 ON DELETE CASCADEgo
--为数据数据处理添加视图
create view qry进仓单
as
select b.物料ID,a.进仓日期,进仓数量=sum(b.数量)
from 进仓主表 a join 进仓明细表 b on a.进仓ID=b.进仓ID
group by b.物料ID,a.进仓日期go
create view qry出仓单
as
select b.物料ID,出仓日期=a.领料日期,出仓数量=sum(b.数量)
from 出仓主表 a join 出仓明细表 b on a.出仓ID=b.出仓ID
group by b.物料ID,a.领料日期go
create view qry进出记录
as
select 物料ID=isnull(a.物料ID,b.物料ID)
,a.进仓日期,进仓数量=sum(a.进仓数量)
,b.出仓日期,出仓数量=sum(b.出仓数量)
,日期=isnull(a.进仓日期,b.出仓日期)
from qry进仓单 a full join qry出仓单 b
on a.物料ID=b.物料ID and a.进仓日期=b.出仓日期
group by isnull(a.物料ID,b.物料ID),a.进仓日期,b.出仓日期,isnull(a.进仓日期,b.出仓日期)go
--初始化数据
insert into 物料明细表
select 'A-001','皮纸','20×30×50','红','张','纸'
union all select 'B-002','磁铁','20×10×50','','块','五金'insert into 进仓主表
select 'J-20031015-001','SA001','2003-10-15','123456',1
union all select 'J-20031015-002','SA002','2003-10-15','123457',1
union all select 'J-20031017-001','SA002','2003-10-17','123456',2insert into 进仓明细表
select 'J-20031015-001','A-001',200
union all select 'J-20031015-002','B-002',99
union all select 'J-20031017-001','A-001',150.5insert into 出仓主表
select 'C-20031015-001','Dept_P','2003-10-15','1111111','P'
union all select 'C-20031016-001','Dept_P','2003-10-16','1111112','P'insert into 出仓明细表
select 'C-20031015-001','A-001',50
union all select 'C-20031016-001','A-001',50
go
--得到要求的结果
--进出记录表
select a.*
,进仓日期=convert(varchar(10),b.进仓日期,120),b.进仓数量
,出仓日期=convert(varchar(10),b.出仓日期,120),b.出仓数量
,当前库存=isnull((select sum(进仓数量) from qry进仓单 where 物料ID=a.物料ID and 进仓日期<=b.日期),0)
-isnull((select sum(出仓数量) from qry出仓单 where 物料ID=a.物料ID and 出仓日期<=b.日期),0)
from 物料明细表 a left join qry进出记录 b on a.物料ID=b.物料ID
order by a.物料ID,b.日期--当前库存表
select a.*,b.当前库存
from 物料明细表 a left join (
select 物料ID,当前库存=isnull(sum(进仓数量),0)-isnull(sum(出仓数量),0) from qry进出记录 group by 物料ID
)b on a.物料ID=b.物料ID
order by a.物料IDgo
--删除测试环境
drop view qry进仓单,qry出仓单,qry进出记录
drop table 进仓明细表,出仓明细表,物料明细表,进仓主表,出仓主表