2

基本的に次のように2つのテーブルを設定しています(非常に軽量なバージョン)。

表1

ID       Amt 1     Amt 2
-------------------------    
112     $20        $30
112     $50        $60
125     $75        $05

表2

ID       Amt 3     Amt 4
-------------------------
112       $25       $30
125       $40       $60
125      $110      $120

すべての金額列を個別に合計する必要があり、出力は次のようになります。

クエリ結果:

ID       Amt 1     Amt 2     Amt 3     Amt 4
--------------------------------------------
112     $70        $90       $25       $30
125     $75        $05       $150      $180

私が試した結合の結果、2番目のテーブルでIDが繰り返される回数の係数でレコードが複製(および合計)されます。これらのテーブルを接続するための主キーがありません。

どんな助けでも大歓迎です。

ありがとう!

4

2 に答える 2

0

この問題を正しく解決するには、集計を個別に行う必要があります。これは、両方のテーブルに同じIDの複数の行がある場合でも機能します。

select id, sum(amt1), sum(amt2), sum(amt3), sum(amt4)
from ((select id, sum(amt1) as amt1, sum(amt2) as amt2, NULL as amt3, NULL as amt4
       from tbl1
       group by id
      ) union all
      (select id, NULL, NULL, sum(amt3), sum(amt4)
       from tbl2
       group by id
      )
     ) t
group by id

上記のクエリは、でアイデアを与えますgroup by。一部の人々full outer joinはこの目的のためにを好みます:

select coalesce(t1.id, t2.id) as id, amt1, amt2, amt3, amt4
from (select id, sum(amt1) as amt1, sum(amt2) as amt2
       from tbl1
       group by id
      ) t1 full outer join
      (select id, sum(amt3) as amt3, sum(amt4) as amt4
       from tbl2
       group by id
      ) t2
      on t1.id = t2.id

重要なのは、結合の前に集計を実行する必要があるため、複数の行の問題が発生しないことです。

于 2012-12-17T20:43:49.650 に答える
0

SQL Server 2005以降では、2つのCTE(共通テーブル式)を使用してテーブルごとに合計/グループ化を実行してから、2つを結合できます(次のようになります)。

;WITH CTE1 AS
(
    SELECT 
        ID, Amount1 = SUM(Amt1), Amount2 = SUM(Amt2)
    FROM
        dbo.SumTbl1
    GROUP BY
        ID  
),
CTE2 AS
(
    SELECT 
        ID, Amount3 = SUM(Amt3), Amount4 = SUM(Amt4)
    FROM
        dbo.SumTbl2
    GROUP BY
        ID  
)
SELECT CTE1.ID, Amount1, Amount2, Amount3, Amount4
FROM CTE1
INNER JOIN CTE2 ON CTE1.ID = CTE2.ID

これは私にあなたの望ましい出力を与えます

于 2012-12-17T20:47:38.840 に答える