繁体   English   中英

连接多个表时,SQL Server SQL将求和结果相乘

[英]SQL Server SQL multiplying Sum results when join multiple tables

如果有人可以帮助我,我将不胜感激。

我正在尝试从一个表中获取结果,在该表中我使用sum()函数并连接了另外两个表。 我的结果在总和列上成倍增加。 这是我的桌子看起来和我想要的结果

表格1

[Id]   [Account_nbr]  [date]       [seq#]  
------------------------------------------
[1234]  [$60] [4321]  [10-15-2012]  [1]
[1234]  [$20] [4321]  [10-15-2012]  [2]
[1234]  [$30] [4321]  [10-15-2012]  [3]
[2345]  [$40] [9876]  [10-15-2012]  [1]
[3456]  [$50] [6543]  [10-15-2012]  [1]

表2

[ID]      [cust_num]
---------------------        
[1234]     [8765]
[2345]     [8766]
[3456]     [8767]

表3

[cust_num]     [account_nbr]
-------------------------------     
[8765]        [4321]
[8767]        [9876]

我的期望的结果将被加入Table 1Table 2使用ID和加入Table 3使用cust_num和看到account_nbrtable 1与匹配account_numberTable 3 ,并且如果匹配,则发现

sum(Table1.Amount),Table1.Id,Table1.Account_nbr,Table1.Date

我正在使用这样的SQL查询,但总和结果却成倍增加

SELECT 
    sum((Table1.Amount), Table1.Id, Table1.Account_nbr, Table1.Date
FROM 
    table1, table2, table3 
WHERE 
    table1.id = table2.id    
    AND table2.cust_num = table3.cust_num    
    AND table1.account_nbr = table3.account_nbr     
GROUP BY
    table1.id,table1.account_nbr,table1.date    
ORDER BY 
    table1.date DESC

但是就像我之前说的,我的结果正在成倍增长。 我期望的结果以表格形式出现,如下所述

[Amount]     [Id]     [Account_nbr]    [Date]
---------------------------------------------------
[$110]       [1234]   [4321]           [10-15-2012]
[$40]        [2345]   [9876]           [10-15-2012]

id = 3456不应该存在,因为相应的account_nbrtable1不存在于table3

好吧,这就是您所需要的。 我只是不明白您最终的成绩是怎么得到2345的,可能是拼写错误?

SQL FIDDLE示例

select
    sum(T1.Amount) as Amount,
    T1.Id,
    T1.account_nbr,
    T1.date
from table1 as T1
    inner join table2 as T2 on T2.Id = T1.Id
    inner join table3 as T3 on T3.cust_num = T2.cust_num and T3.account_nbr = T1.account_nbr
group by
    T1.Id,
    T1.account_nbr,
    T1.date

如果table1.id=table2.idtable2.cust_num=table3.cust_num不是1:1关系,则将获得预期SUM的倍数。 这称为笛卡尔乘积。 table1.account_nbr=table3.account_nbr有所缓解,但是您仍然可以使笛卡尔积产生。

  SELECT sum(Amount) Amount, Id, Account_nbr, Date
    FROM table1
   WHERE EXISTS (
       SELECT 1
         FROM table2
         JOIN table3 on table2.cust_num = table3.cust_num
        WHERE table1.id = table2.id    
          AND table1.account_nbr = table3.account_nbr)
GROUP BY id, account_nbr, date    
ORDER BY date DESC

上面的查询仅从表1中获得了相同的SUM,同时测试您可以一直在t1-t2,t2-t3和t3-t1之间找到匹配项。

我认为最好先计算总和,然后再进行所有其他运算。

SELECT T1.amount AS Amount, 
       T1.id, 
       T1.account_nbr, 
       T1.DATE 
FROM   (SELECT SUM(t1.amount) AS Amount, 
               t1.id, 
               t1.account_nbr, 
               t1.DATE 
        FROM   table1 
        GROUP  BY t1.id, 
                  t1.account_nbr, 
                  t1.DATE)AS T1 
       inner join table2 AS T2 
               ON T2.id = T1.id 
       inner join table3 AS T3 
               ON T3.cust_num = T2.cust_num 
                  AND T3.account_nbr = T1.account_nbr'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM