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