首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请问一个三表查询的有关问题

2012-01-21 
请教一个三表查询的问题有三个表产品资料表 products p字段有id,Pro_Name进仓明细表 storageindtail si字

请教一个三表查询的问题
有三个表
产品资料表 products p
字段有id,Pro_Name

进仓明细表 storageindtail si
字段有product_id,amount

出仓明细表 storageoutdetail so
字段有product_id,amount

我想统计出 p.product,sum(si.amount)as 入库数量,sum(so.amount)as 出库数量
我用这个语句试过,但入库数量对了,出库数量对不上

select p.pro_name,sum(si.amount)as 入库数量,sum(so.amount)as 出库数量 
from products p left join storageindetail si on p.id=si.product_id left join storageoutdetail so on p.id=so.product_id 
group by p.pro_name

12寸布12288.002640.00
15寸布NULL NULL
20寸布200.00 NULL
帆布4600.00 NULL
花边1000.00 NULL
钮扣1300.02 NULL

select p.pro_name,sum(si.amount)as 入库数量 
from products p left join storageindetail si on p.id=si.product_id 
group by p.pro_name

12寸布12288.00
15寸布NULL
20寸布200.00
帆布4600.00
花边1000.00
钮扣1300.02


select p.pro_name,sum(so.amount)as 入库数量 
from products p left join storageoutdetail so on p.id=so.product_id 
group by p.pro_name

12寸布120.00
15寸布NULL
20寸布NULL
帆布NULL
花边NULL
钮扣NULL

两个数差了2000多,这个问题困扰了很久,请各位大侠给个查询方法吧,谢谢大家了

[解决办法]
select p.pro_name,sum(si.amount)as 入库数量,sum(so.amount)as 出库数量
from products p left join storageindetail si on p.id=si.product_id left join storageoutdetail so on p.id=so.product_id
group by p.pro_name

这样统计是不对的.
如果某一连接在某一主键上有N条记录,而相应的另一左连接有一条数据,则另一左连接的统计就会多统计N-1次.
分析一下下面的数据你就能明白了:

SQL code
create table t1(id int,col varchar(10))insert into t1 select 1,'agbf'insert into t1 select 2,'fds'insert into t1 select 3,'vaisud'create table t2(id int,col int)insert into t2 select 1,234create table t3(id int,col int)insert into t3 select 1,347145insert into t3 select 1,102201insert into t3 select 2,874goselect a.id,sum(b.col)si,SUM(c.col)sofrom t1 a left join t2 b on a.id=b.idleft join t3 c on a.id=c.idgroup by a.idselect a.id,sum(b.col)sifrom t1 a left join t2 b on a.id=b.idgroup by a.idselect a.id,SUM(c.col)sofrom t1 a left join t3 c on a.id=c.idgroup by a.id/*id          si          so----------- ----------- -----------1           468         4493462           NULL        8743           NULL        NULL警告: 聚合或其他 SET 操作消除了 Null 值。(3 行受影响)id          si----------- -----------1           2342           NULL3           NULL警告: 聚合或其他 SET 操作消除了 Null 值。(3 行受影响)id          so----------- -----------1           4493462           8743           NULL警告: 聚合或其他 SET 操作消除了 Null 值。(3 行受影响)*/godrop table t1,t2,t3 

热点排行