如何构造SQL语句然后将多表查询生成另一张表呢?

时间:2021-09-08 19:20:55
入库表(InTable):
key  货名    入库数量 入库金额
A01  打印机    2        2000
A02  电视      5        4000

出库表(OutTable):
key  货名    出库数量 出库金额
B01  电脑        1        5000
B02  复印机      3        1400

库存表
key  货名    出入库标志  库存数量    库存金额    
B01  电脑       出库           3        15000
A01  打印机     入库           5        10000
B02  复印机     出库           4         6000
A02  电视       入库           6        8000


现在想根据库存表的出入库标志,查找对应的入库表或者出库表,然后生成一张下面格式的财务表
应该怎么做呢?谢谢
key  货名  出入库标志  入库数量  入库金额  出库数量  出库金额   库存数量    库存金额  
B01  电脑     出库                           1         5000        3           15000
A01  打印机   入库        2         2000                            5           10000
B02  复印机   出库                           3          1400       4            6000
A02  电视     入库        5        4000                            6            8000

7 个解决方案

#1


select a.[key],a.货名,a.出入库标志
,入库数量=isnull(cast(b.入库数量 as varchar),'')
,入库金额=isnull(cast(b.入库金额 as varchar),'')
,出库数量=isnull(cast(c.出库数量 as varchar),'')
,出库金额=isnull(cast(c.出库金额 as varchar),'')
,a.库存数量,a.库存金额
from 库存表 a
left join InTable b on a.出入库标志='入库' and a.[key]=b.[key]
left join OutTable c on a.出入库标志='出库' and a.[key]=c.[key]

#2


up

#3


--测试

--测试数据
create table InTable([key] varchar(10),货名 varchar(10),入库数量 int,入库金额 int)
insert InTable select 'A01','打印机',2,2000
union  all     select 'A02','电视'  ,5,4000

create table OutTable([key] varchar(10),货名 varchar(10),出库数量 int,出库金额 int)
insert OutTable select 'B01','电脑'  ,1,5000
union  all      select 'B02','复印机',3,1400

create table 库存表([key] varchar(10),货名 varchar(10),出入库标志 varchar(10),库存数量 int,库存金额 int)
insert 库存表 select 'B01','电脑'  ,'出库',3,15000
union  all    select 'A01','打印机','入库',5,10000
union  all    select 'B02','复印机','出库',4,6000
union  all    select 'A02','电视'  ,'入库',6,8000
go

--查询
select a.[key],a.货名,a.出入库标志
,入库数量=isnull(cast(b.入库数量 as varchar),'')
,入库金额=isnull(cast(b.入库金额 as varchar),'')
,出库数量=isnull(cast(c.出库数量 as varchar),'')
,出库金额=isnull(cast(c.出库金额 as varchar),'')
,a.库存数量,a.库存金额
from 库存表 a
left join InTable b on a.出入库标志='入库' and a.[key]=b.[key]
left join OutTable c on a.出入库标志='出库' and a.[key]=c.[key]
go

--删除测试
drop table 库存表,InTable,OutTable

/*--测试结果

key  货名      出入库标志  入库数量  入库金额    出库数量   出库金额    库存数量  库存金额
---- -------- ---------- --------- ----------- --------- ---------- --------- ----------
B01  电脑     出库                             1          5000       3         15000
A01  打印机   入库         2        2000                             5         10000
B02  复印机   出库                             3          1400       4         6000
A02  电视     入库         5        4000                             6         8000

(所影响的行数为 4 行)
--*/

#4


怎么又碰上老邹拉!~~~



真是冤家路窄


呵呵

#5


楼主,看不明有什么规律可寻

#6


收藏本贴!!!~~~~

#7


--测试数据表建立
declare @intable table([key] varchar(10),货名 varchar(10),入库数量 int,入库金额 int)
declare @outtable table([key] varchar(10),货名 varchar(10),出库数量 int,出库金额 int)
declare @warehouse table([key] varchar(10),货名 varchar(10),出入库标志 varchar(10),库存数量 int,库存金额 int)
--测试数据插入
insert @intable
select 'A01','打印机',2,2000
union all
select 'A02','电视',5,4000


insert @outtable
select 'B01','电脑',1,5000
union all
select 'B02','复印机',3,1400

insert @warehouse
select 'B01','电脑','出库',3,15000
union all
select 'A01','打印机','入库',5,10000
union all
select 'B02','复印机','出库',4,6000
union all
select 'A02','电视','入库',6,8000

--查询
select  a.[key],
a.货名,
a.出入库标志,
isnull(c.入库数量,0) 入库数量,
isnull(c.入库金额,0) 入库金额,
isnull(b.出库数量,0) 出库数量,
isnull(b.出库金额,0) 出库金额,
a.库存数量,
a.库存金额
from @warehouse a
left join @outtable b on a.[key] = b.[key]
left join @intable c on a.[key] = c.[key]

--结果

key        货名         出入库标志      入库数量        入库金额        出库数量        出库金额        库存数量        库存金额        
---------- ---------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- 
B01        电脑         出库         0           0           1           5000        3           15000
A01        打印机        入库         2           2000        0           0           5           10000
B02        复印机        出库         0           0           3           1400        4           6000
A02        电视         入库         5           4000        0           0           6           8000

#1


select a.[key],a.货名,a.出入库标志
,入库数量=isnull(cast(b.入库数量 as varchar),'')
,入库金额=isnull(cast(b.入库金额 as varchar),'')
,出库数量=isnull(cast(c.出库数量 as varchar),'')
,出库金额=isnull(cast(c.出库金额 as varchar),'')
,a.库存数量,a.库存金额
from 库存表 a
left join InTable b on a.出入库标志='入库' and a.[key]=b.[key]
left join OutTable c on a.出入库标志='出库' and a.[key]=c.[key]

#2


up

#3


--测试

--测试数据
create table InTable([key] varchar(10),货名 varchar(10),入库数量 int,入库金额 int)
insert InTable select 'A01','打印机',2,2000
union  all     select 'A02','电视'  ,5,4000

create table OutTable([key] varchar(10),货名 varchar(10),出库数量 int,出库金额 int)
insert OutTable select 'B01','电脑'  ,1,5000
union  all      select 'B02','复印机',3,1400

create table 库存表([key] varchar(10),货名 varchar(10),出入库标志 varchar(10),库存数量 int,库存金额 int)
insert 库存表 select 'B01','电脑'  ,'出库',3,15000
union  all    select 'A01','打印机','入库',5,10000
union  all    select 'B02','复印机','出库',4,6000
union  all    select 'A02','电视'  ,'入库',6,8000
go

--查询
select a.[key],a.货名,a.出入库标志
,入库数量=isnull(cast(b.入库数量 as varchar),'')
,入库金额=isnull(cast(b.入库金额 as varchar),'')
,出库数量=isnull(cast(c.出库数量 as varchar),'')
,出库金额=isnull(cast(c.出库金额 as varchar),'')
,a.库存数量,a.库存金额
from 库存表 a
left join InTable b on a.出入库标志='入库' and a.[key]=b.[key]
left join OutTable c on a.出入库标志='出库' and a.[key]=c.[key]
go

--删除测试
drop table 库存表,InTable,OutTable

/*--测试结果

key  货名      出入库标志  入库数量  入库金额    出库数量   出库金额    库存数量  库存金额
---- -------- ---------- --------- ----------- --------- ---------- --------- ----------
B01  电脑     出库                             1          5000       3         15000
A01  打印机   入库         2        2000                             5         10000
B02  复印机   出库                             3          1400       4         6000
A02  电视     入库         5        4000                             6         8000

(所影响的行数为 4 行)
--*/

#4


怎么又碰上老邹拉!~~~



真是冤家路窄


呵呵

#5


楼主,看不明有什么规律可寻

#6


收藏本贴!!!~~~~

#7


--测试数据表建立
declare @intable table([key] varchar(10),货名 varchar(10),入库数量 int,入库金额 int)
declare @outtable table([key] varchar(10),货名 varchar(10),出库数量 int,出库金额 int)
declare @warehouse table([key] varchar(10),货名 varchar(10),出入库标志 varchar(10),库存数量 int,库存金额 int)
--测试数据插入
insert @intable
select 'A01','打印机',2,2000
union all
select 'A02','电视',5,4000


insert @outtable
select 'B01','电脑',1,5000
union all
select 'B02','复印机',3,1400

insert @warehouse
select 'B01','电脑','出库',3,15000
union all
select 'A01','打印机','入库',5,10000
union all
select 'B02','复印机','出库',4,6000
union all
select 'A02','电视','入库',6,8000

--查询
select  a.[key],
a.货名,
a.出入库标志,
isnull(c.入库数量,0) 入库数量,
isnull(c.入库金额,0) 入库金额,
isnull(b.出库数量,0) 出库数量,
isnull(b.出库金额,0) 出库金额,
a.库存数量,
a.库存金额
from @warehouse a
left join @outtable b on a.[key] = b.[key]
left join @intable c on a.[key] = c.[key]

--结果

key        货名         出入库标志      入库数量        入库金额        出库数量        出库金额        库存数量        库存金额        
---------- ---------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- 
B01        电脑         出库         0           0           1           5000        3           15000
A01        打印机        入库         2           2000        0           0           5           10000
B02        复印机        出库         0           0           3           1400        4           6000
A02        电视         入库         5           4000        0           0           6           8000