我加入三张桌子时的问题

时间:2014-04-09 20:32:43

标签: sql sql-server sql-server-2008 tsql

我有三个表TeamTerritoryMappingUpdQuotaTbltblInvoiceFile

当我加入前两张表时,我得到了正确的结果

 select 
     TTM.Team, Sum(Upd.Quota) as Quota 
 from 
     TeamTerritoryMapping TTM
 inner join 
     UpdQuotaTbl upd on upd.ITM = TTm.Territory
 where 
     upd.Month = 'july' 
 group by 
     TTM.Team

但当我从第三个表加入来自tblinvoicefile的另一个列收入时,某些行会重复,最终结果会变得更高。以下是我用来加入3个表格的查询

select 
    TTM.Team,
    Sum(upd.Quota) as quota,
    sum(inv.[End MS Sales Revenue]) as Revenue 
from 
    UpdQuotaTbl Upd
inner join 
    TeamTerritoryMapping TTM on TTM.Territory = upd.ITM
inner join 
    tblInvoiceFile inv on inv.[Inv Territory] = TTM.Territory
where 
    upd.Month = 'july' 
    and inv.[End Fiscal Month] = 'July, 2013'

那么如何根除第三个表中的重复值,当我加入两个表时,我得到了正确的值,即TeamTerritoryMapping,UpdQuotaTbl和表TeamTerritoryMapping

2 个答案:

答案 0 :(得分:1)

看起来tblInvoiceFile有多个[Invenio Territory]的entires导致了这个问题。如果您的目的是引入并汇总该表的所有[结束MS销售收入],您可以尝试这样的事情

SELECT TTM.Team,Sum(upd.Quota) as quota,sum(inv.[End MS Sales Revenue]) as Revenue 
FROM UpdQuotaTbl Upd
    INNER JOIN TeamTerritoryMapping TTM ON TTM.Territory = upd.ITM
    INNER JOIN 
        (SELECT [Invenio Territory], SUM([End MS Sales Revenue]) AS [End MS Sales Revenue]
            FROM  tblInvoiceFile 
            WHERE [End Fiscal Month] = 'July, 2013'
            GROUP BY [Invenio Territory]) AS inv 
        ON inv.[Invenio Territory] = TTM.Territory
WHERE upd.Month = 'july' 

答案 1 :(得分:0)

我的初步回答是:您多次获得某些结果的原因是因为用于加入ON的{​​{1}}不够“独特”。如果您查看所述表的主键(或唯一?),您可能会注意到它不仅仅涉及tblInvoiceFile字段。

要解决这个问题,你可以做两件事。

  1. 展开Inv Territory子句以包含更多使连接唯一的字段
  2. 保持现在的查询,但汇总结果,以便发票信息获得ON med
  3. 问题是,好像你已经SUM了解信息(虽然如Win所说,你错过了SUM()),所以我不太清楚为什么这不行。

    更新:现在才意识到你的问题不是加倍记录,而是在第一个SUM()中加倍。解决这个问题的最佳方法是通过预聚合Abhi所示的值。