SQL外部联接返回的数据太多
我有两张桌子:SQL外部联接返回的数据太多,sql,sql-server-2008,Sql,Sql Server 2008,我有两张桌子: create table custinvoicetrans ( LINEAMOUNTMST numeric(28,12) , INVENTTRANSID nvarchar(20) , DATAAREAID nvarchar (4) ) ; insert into custinvoicetrans (LINEAMOUNTMST, INVENTTRANSID, DATAAREAID) VALUES (2685.850000000000,
create table custinvoicetrans
( LINEAMOUNTMST numeric(28,12)
, INVENTTRANSID nvarchar(20)
, DATAAREAID nvarchar (4)
)
;
insert into custinvoicetrans (LINEAMOUNTMST, INVENTTRANSID, DATAAREAID) VALUES
(2685.850000000000, N'00006840_069', N'dk-l'),
(6162.220000000000, N'00034511_069', N'DK-L'),
(-1453.350000000000, N'00035042_069', N'DK-L')
;
create table INVENTTRANS
( CUSTVENDAC nvarchar(20)
, ItemId nvarchar(20)
, QTY numeric(28,12)
, COSTAMOUNTPOSTED numeric(28,12)
, COSTAMOUNTPHYSICAL numeric(28,12)
, COSTAMOUNTADJUSTMENT numeric(28,12)
, DATAAREAID nvarchar(20)
, INVENTTRANSID nvarchar(20)
)
;
insert into INVENTTRANS (CUSTVENDAC, ItemId, QTY, COSTAMOUNTPOSTED, COSTAMOUNTPHYSICAL, COSTAMOUNTADJUSTMENT, DATAAREAID, INVENTTRANSID) VALUES
(N'100251', N'F20100003', -120.000000000000, 0.000000000000, 0.000000000000, -1034.630000000000, N'dk-l', N'00006840_069'),
(N'100251', N'F20301000', -50.000000000000, -664.500000000000, -664.500000000000, 0.000000000000, N'DK-L', N'00034511_069'),
(N'100251', N'F20301000', -162.000000000000, -2152.980000000000, -2152.980000000000, 0.000000000000, N'DK-L', N'00034511_069'),
(N'100251', N'F20301000', 50.000000000000, 664.500000000000, 664.500000000000, 0.000000000000, N'DK-L', N'00035042_069')
;
当我像下面这样连接表时,当从custinvoicetrans获取值时,我会得到项目“20301000”的双值。
我不知道该怎么办——我花了好几个小时用各种不同的方式来解决这个问题,但我无法得到正确的数量
请帮帮我
我知道哪里出了问题,但我找不到解决办法
马丁
select CUSTVENDAC
, ITEMID
, sum(QTY) QTY
, sum(LINEAMOUNTMST) Revenue
, sum(LINEAMOUNTMST) + sum(COSTAMOUNTADJUSTMENT) + sum(COSTAMOUNTPHYSICAL) Margin
from INVENTTRANS
left outer join CUSTINVOICETRANS on INVENTTRANS.INVENTTRANSID = CUSTINVOICETRANS.INVENTTRANSID
and INVENTTRANS.DATAAREAID = CUSTINVOICETRANS.DATAAREAID
where INVENTTRANS.DATAAREAID = 'dk-l'
and INVENTTRANS.CUSTVENDAC = '100251'
group by INVENTTRANS.CUSTVENDAC
, INVENTTRANS.ITEMID
order by INVENTTRANS.CUSTVENDAC
, INVENTTRANS.ITEMID
您应该注意在上的内部使用谓词 “非常重要的一点是要了解,使用外部连接时 WHERE子句扮演着非常不同的角色,因此它们不是 可以互换。WHERE子句仍然起着简单的过滤作用 角色即,它保留真实案例,丢弃虚假和未知案例。 在where子句中使用类似的谓词。但是, ON子句不起简单的过滤作用;相反,它更重要 匹配的角色。换句话说,保留端的一行将 返回ON谓词是否为其找到匹配项 ON谓词仅确定从非保留端获取哪些行 匹配到保留端的行,而不是是否返回行 从保留端。“**考试70-461:查询Microsoft SQL Server 2012年
您可以为INVENTRANS表创建子查询
select CUSTVENDAC
, ITEMID
, sum(QTY) QTY
, sum(LINEAMOUNTMST) Revenue
, sum(LINEAMOUNTMST) + sum(COSTAMOUNTADJUSTMENT) + sum(COSTAMOUNTPHYSICAL) Margin
from (
Select
CUSTVENDAC,
ITEMID,
sum(QTY) 'QTY',
sum(COSTAMOUNTPOSTED) 'COSTAMOUNTPOSTED',
sum(COSTAMOUNTPHYSICAL) 'COSTAMOUNTPHYSICAL',
sum(COSTAMOUNTADJUSTMENT) 'COSTAMOUNTADJUSTMENT',
DATAAREAID,
INVENTTRANSID
from INVENTTRANS
group by
CUSTVENDAC,
ITEMID,
DATAAREAID,
INVENTTRANSID
)INVENTTRANS
left outer join #CUSTINVOICETRANS CUSTINVOICETRANS on INVENTTRANS.INVENTTRANSID = CUSTINVOICETRANS.INVENTTRANSID
and INVENTTRANS.DATAAREAID = CUSTINVOICETRANS.DATAAREAID
where INVENTTRANS.DATAAREAID = 'dk-l'
and INVENTTRANS.CUSTVENDAC = '100251'
group by INVENTTRANS.CUSTVENDAC
, INVENTTRANS.ITEMID
order by INVENTTRANS.CUSTVENDAC
, INVENTTRANS.ITEMID
发布的代码没有在SQLFIDLE中进行分析。我整理了一下,编辑了你的帖子。小提琴手:-你期望的输出是什么?什么不起作用?你期望什么?由于值“00034511_069”在INVENTTRANS表中出现两次,因此您将获得两个成功连接的行!我不明白?!真正的密特拉迪尔。问题是,两个成功连接的行意味着我得到的值被计数两次。我只需要一次值。我希望输出是这样的:100251 F20301000 162,00 4.708,87 2.555,89SchmitzIT-感谢您清理我的代码,特别是向我介绍SQLFIDLE!!看起来真的很酷!您需要按LINEAMOUNTMST分组,并在just take max(LINEAMOUNTMST)上使用此值而不进行聚合。所有这些都假设每个INVENTTRANS行没有多个CUSTINVOICETRANS记录。使用where子句上的谓词。我不理解这一点。您能举个例子吗?INVENTTRANS.INVENTTRANSID=CUSTINVOICETRANS.INVENTTRANSID上的左外部联接#CUSTINVOICETRANS CUSTINVOICETRANS,其中INVENTTRANS.DATAAREAID='dk-l'和INVENTTRANS.DATAAREAID=CUSTINVOICETRANS.DATAAREAID