大概例子如下:
表1:TableHead
字段:
PID 内码
PCustomer 客户
...等字段
数据大概如下:
PID PCustomer ...
1 张三
2 张三
表2:TableBody1
字段:
PID 内码 与TableHead关联
PEntryID 分录序号
PBillNumber 单据号
PDate 日期
PGoods 商品种类
PQty 数量
PAmount 金额
数据大概如下:
PID PEntryID FBillNumber PDate PGoods FQty PAmount
1 1 A类单据0001 2009-08-09 商品1 100 1000
1 2 A类单据0001 2009-08-09 商品2 50 800
1 3 A类单据0002 2009-08-10 商品3 60 600
2 1 A类单据0003 2009-08-11 商品1 70 800
2 2 A类单据0003 2009-08-11 商品3 10 50 表3:TableBody2
字段:
PID 内码 与TableHead关联
PEntryID 分录序号
PBillNumber 单据号
PDate 日期
PGoods 商品种类
PQty 数量
PAmount 金额
数据大概如下:
PID PEntryID FBillNumber PDate PGoods FQty PAmount
1 1 B类单据0001 2009-08-09 商品1 10 100
1 2 B类单据0001 2009-08-09 商品2 20 200
1 3 B类单据0002 2009-08-10 商品3 30 300
1 4 B类单据0002 2009-08-10 商品4 40 400
2 1 B类单据0003 2009-08-11 商品2 70 800 表4:TableBody3
字段:
PID 内码 与TableHead关联
PEntryID 分录序号
PBillNumber 单据号
PDate 日期
PGoods 商品种类
PQty 数量
PAmount 金额
数据大概如下:
PID PEntryID FBillNumber PDate PGoods FQty PAmount
1 1 C类单据0001 2009-08-09 商品1 10 100
1 2 C类单据0001 2009-08-09 商品3 20 200
2 1 C类单据0003 2009-08-11 商品4 70 800以上为基础表
想通过这些基础表形成以下的报表形式
PCustomer PGoods A类单据号 日期 数量 金额 B类单据号 日期 数量 金额 C类单据号 日期 数量 金额
张三 商品1 A类单据0001 ..... B类单据0001 ..... C类单据0001 .....
A类单据0003 .....
张三 商品2 A类单据0001 ..... B类单据0001 .....
B类单据0003 .....
张三 商品3 A类单据0002 ..... B类单据0002 C类单据0001 .....
A类单据0003 .....
张三 商品4 B类单据0002 ..... C类单据0003 .....
表1:TableHead
字段:
PID 内码
PCustomer 客户
...等字段
数据大概如下:
PID PCustomer ...
1 张三
2 张三
表2:TableBody1
字段:
PID 内码 与TableHead关联
PEntryID 分录序号
PBillNumber 单据号
PDate 日期
PGoods 商品种类
PQty 数量
PAmount 金额
数据大概如下:
PID PEntryID FBillNumber PDate PGoods FQty PAmount
1 1 A类单据0001 2009-08-09 商品1 100 1000
1 2 A类单据0001 2009-08-09 商品2 50 800
1 3 A类单据0002 2009-08-10 商品3 60 600
2 1 A类单据0003 2009-08-11 商品1 70 800
2 2 A类单据0003 2009-08-11 商品3 10 50 表3:TableBody2
字段:
PID 内码 与TableHead关联
PEntryID 分录序号
PBillNumber 单据号
PDate 日期
PGoods 商品种类
PQty 数量
PAmount 金额
数据大概如下:
PID PEntryID FBillNumber PDate PGoods FQty PAmount
1 1 B类单据0001 2009-08-09 商品1 10 100
1 2 B类单据0001 2009-08-09 商品2 20 200
1 3 B类单据0002 2009-08-10 商品3 30 300
1 4 B类单据0002 2009-08-10 商品4 40 400
2 1 B类单据0003 2009-08-11 商品2 70 800 表4:TableBody3
字段:
PID 内码 与TableHead关联
PEntryID 分录序号
PBillNumber 单据号
PDate 日期
PGoods 商品种类
PQty 数量
PAmount 金额
数据大概如下:
PID PEntryID FBillNumber PDate PGoods FQty PAmount
1 1 C类单据0001 2009-08-09 商品1 10 100
1 2 C类单据0001 2009-08-09 商品3 20 200
2 1 C类单据0003 2009-08-11 商品4 70 800以上为基础表
想通过这些基础表形成以下的报表形式
PCustomer PGoods A类单据号 日期 数量 金额 B类单据号 日期 数量 金额 C类单据号 日期 数量 金额
张三 商品1 A类单据0001 ..... B类单据0001 ..... C类单据0001 .....
A类单据0003 .....
张三 商品2 A类单据0001 ..... B类单据0001 .....
B类单据0003 .....
张三 商品3 A类单据0002 ..... B类单据0002 C类单据0001 .....
A类单据0003 .....
张三 商品4 B类单据0002 ..... C类单据0003 .....
t2.PGoods , t2.FBillNumber , t2.PDate , t2.FQty , t2.je,
t3.PGoods , t3.FBillNumber , t3.PDate , t3.FQty , t3.je,
t4.PGoods , t4.FBillNumber , t4.PDate , t4.FQty , t4.je
from TableHead t1
left join (select PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody1 group by PGoods , FBillNumber , PDate) t2 on t1.PID = t2.PID
left join (select PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody2 group by PGoods , FBillNumber , PDate) t3 on t1.PID = t3.PID
left join (select PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody3 group by PGoods , FBillNumber , PDate) t4 on t1.PID = t4.PID
if object_id('[TableHead]') is not null drop table [TableHead]
go
create table [TableHead]([PID] int,[PCustomer] varchar(50))
insert [TableHead]
select 1,'张三' union all
select 2,'李四'--
if object_id('[TableBody1]') is not null drop table [TableBody1]
go
create table [TableBody1]([PID] int,[PEntryID] int,FBillNumber varchar(50), PDate datetime,PGoods varchar(50),FQty int ,PAmount int)
insert [TableBody1]
select 1,1,'A类单据0001','2009-08-09','商品1',100,1000 union all
select 1,2,'A类单据0001','2009-08-09','商品2',50 , 800 union all
select 1,3,'A类单据0002','2009-08-10','商品3',60 , 600 union all
select 2,1,'A类单据0003','2009-08-11','商品1',70 , 800 union all
select 2,2,'A类单据0003','2009-08-11','商品3',10 , 50
--
if object_id('[TableBody2]') is not null drop table [TableBody2]
go
create table [TableBody2]([PID] int,[PEntryID] int,FBillNumber varchar(50), PDate datetime,PGoods varchar(50),FQty int ,PAmount int)
insert [TableBody2]
select 1,1,'B类单据0001','2009-08-09','商品1',10 , 100 union all
select 1,2,'B类单据0001','2009-08-09','商品2',20 , 200 union all
select 1,3,'B类单据0002','2009-08-10','商品3',30 , 300 union all
select 1,4,'B类单据0002','2009-08-10','商品4',40 , 400 union all
select 2,1,'B类单据0003','2009-08-11','商品2',70 , 800
--
if object_id('[TableBody3]') is not null drop table [TableBody3]
go
create table [TableBody3]([PID] int,[PEntryID] int,FBillNumber varchar(50), PDate datetime,PGoods varchar(50),FQty int ,PAmount int)
insert [TableBody3]
select 1,1,'C类单据0001','2009-08-09','商品1',10 , 100 union all
select 1,2,'C类单据0001','2009-08-09','商品3',20 , 200 union all
select 2,1,'C类单据0003','2009-08-11','商品4',70 , 800
--
/*查询*/
-- 左连接串
--select * from ( select a.PID,a.PCustomer, b.PGoods from TableHead a left join
--(select distinct PID,PGoods from (select distinct PID,PGoods from TableBody1 union all
--select distinct PID,PGoods from TableBody2 union all
--select distinct PID,PGoods from TableBody3 ) c )b on a.PID=b.PID ) t1 order by t1.PID ,t1.PGoodsselect t1.PCustomer,
t2.PGoods , t2.FBillNumber , t2.PDate , t2.FQty , t2.je,
t3.PGoods , t3.FBillNumber , t3.PDate , t3.FQty , t3.je,
t4.PGoods , t4.FBillNumber , t4.PDate , t4.FQty , t4.je
from ( select a.PID,a.PCustomer, b.PGoods from TableHead a left join
(select distinct PID,PGoods from (select distinct PID,PGoods from TableBody1 union all
select distinct PID,PGoods from TableBody2 union all
select distinct PID,PGoods from TableBody3 ) c )b on a.PID=b.PID ) t1
full join (select PID,PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody1 group by PID,PGoods , FBillNumber , PDate) t2 on t1.PID = t2.PID and t1.PGoods=t2.PGoods
full join (select PID,PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody2 group by PID,PGoods , FBillNumber , PDate) t3 on t1.PID = t3.PID and t1.PGoods=t3.PGoods
full join (select PID,PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody3 group by PID,PGoods , FBillNumber , PDate) t4 on t1.PID = t4.PID and t1.PGoods=t4.PGoods
/*执行结果*/
张三 商品1 A类单据0001 2009-08-09 00:00:00.000 100 100000 商品1 B类单据0001 2009-08-09 00:00:00.000 10 1000 商品1 C类单据0001 2009-08-09 00:00:00.000 10 1000
张三 商品2 A类单据0001 2009-08-09 00:00:00.000 50 40000 商品2 B类单据0001 2009-08-09 00:00:00.000 20 4000 NULL NULL NULL NULL NULL
张三 商品3 A类单据0002 2009-08-10 00:00:00.000 60 36000 商品3 B类单据0002 2009-08-10 00:00:00.000 30 9000 商品3 C类单据0001 2009-08-09 00:00:00.000 20 4000
张三 NULL NULL NULL NULL NULL 商品4 B类单据0002 2009-08-10 00:00:00.000 40 16000 NULL NULL NULL NULL NULL
李四 商品1 A类单据0003 2009-08-11 00:00:00.000 70 56000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
李四 NULL NULL NULL NULL NULL 商品2 B类单据0003 2009-08-11 00:00:00.000 70 56000 NULL NULL NULL NULL NULL
李四 商品3 A类单据0003 2009-08-11 00:00:00.000 10 500 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
李四 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 商品4 C类单据0003 2009-08-11 00:00:00.000 70 56000
----没有一个 PGoods 商品种类 关联的表吗?
----所有的商品应该有个“商品信息表才对的啊?----不然:报表多了,都要先去distinct再去联结, 多麻烦啊?