2

誰かがこれで私を助けることができれば大歓迎です。

sum() 関数を使用してさらに 2 つのテーブルを結合する 1 つのテーブルから結果を取得しようとしています。私の結果は合計列で乗算されています。これが私のテーブルの外観と私の望ましい結果です

表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]

私の望ましい結果は、 join Table 1Table 2using ID、 join Table 3using cust_num、 see account_nbrfromがinとtable 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_nbrfromtable1が存在しないため、 は存在しないはずtable3です。

4

3 に答える 3

3

さて、ここにあなたが必要とするものがあります。最終結果で 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
于 2012-10-27T05:32:32.683 に答える
2

table1.id=table2.idまたはtable2.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

上記のクエリは、t1-t2、t2-t3、および t3-t1 の間で完全に一致することをテストしながら、table1 だけから同じ SUM を取得します。

于 2012-10-27T04:11:10.423 に答える