2016-06-28 4 views
1

2つ以上のテーブルを持つ左結合を適用しているときに、行の合計を取得しようとしています。それは間違ったサム関数をもたらす結果の行列を作成しているようです。1つ以上のテーブルを持つSum句を使用した左結合が正しくないSum

例:

まず表:カスタマー

第二表:TotalAssets

第三表:TotalLiability

テーブルの構造:

カスタマー

CustID(int) CustomerName(varchar) 
1   Abc 
2   Def 
3   Ghi 

TotalAssets

CustID  Amount 
1   2000 
1   1000 
2   600 

TotalLiability

CustID  Amount 
1   1000 
1   1000 
2   800 

予想される出力

CustID TotalAssets TotalLiability 
1   3000   2000 
2   600   800 

現在のクエリ

Select c.CustID , Sum(a.Amount) , Sum(l.Amount) From Customer c 
left join TotalAssests a on a.CustID = c.CustID 
left join TotalLiability l on l.CustID = c.CustID 
Group by c.CustID 

この現在のクエリとの問題は、私が最初に左に複数のレコードを持つ最初のセットを作成して参加した後、第2 1が適用されると考えると合計が正しくないです。

すべてのヘルプは高く評価され

UPDATE:

私は法に従うことによって、いくつかの幸運を見つけることが、私はすることにより、グループ内の7-8以上の要素を持っている私の場合のように、それは悪い/ハックオプションだし、より多くの左句を追加すると、クエリの管理が困難になります。

正しい結果を結果が、これは動作するはず

Select Set1.CustID , Set1.TotalAssets, Sum(l.Amount) from (Select c.CustID , Sum(a.Amount) as TotalAssets From Customer c 
left join TotalAssests a on a.CustID = c.CustID 
Group by c.CustID)Set1 
left join TotalLiability l on l.CustID = Set1.CustID. 
Group by Set1.CustID , Set1.TotalAssets 
+2

予想外の結果は何ですか? – artm

+1

あなたは何を得ていますか?あなたのテーブル構造を把握させたり、独自のテストデータを作成したりしないでください。 – Blorgbeard

+0

@artm私はサンプル出力とサンプルデータを使った短いクエリで質問を書き直しました。 –

答えて

2

私は、これはあなたが最小限の複雑さに何をしたいあなたを取得思う:

select c.CustId, isnull(a.Amount, 0) as TotalAssets, isnull(l.Amount, 0) as TotalLiability 
from Customers c 
left join (
    select CustId, sum(Amount) as Amount from TotalAssets group by CustId 
) a on a.CustId = c.CustId 
left join (
    select CustId, sum(Amount) as Amount from TotalLiability group by CustId 
) l on l.CustId = c.CustId 

2つのテーブルは独立しているため、2つのテーブルは別々です。両方をcustomers表に左結合すると、いずれか/両方の表に項目がない顧客が依然として報告されます。以下は、少ないメンテナンスで動作します

0

を維持するために非常に悪いに見える新しいクエリは:

Select c.CustID 
, (select sum(a.amount) from TotalAssests a where a.CustId = c.CustID) as SumAsset 
, (select Sum(l.Amount) TotalLiability l where l.CustID = c.CustID) as SumLiability 
From Customer c 
+0

相関サブクエリは最もパフォーマンスの良いものではありませんが、動作するはずです。 – Blorgbeard

-2

希望、

DECLARE @Customer TABLE (CustID int, CustomerName varchar(50)) DECLARE @TotalAssets TABLE (CustID int, Amount INT) DECLARE @TotalLiability TABLE (CustID int, Amount INT) 
INSERT INTO @Customer 
SELECT 1, 
     'ABC' 
UNION 
SELECT 2, 
     'DEF' 
UNION 
SELECT 3, 
     'GHI' 

--Select * From @Customer 

INSERT INTO @TotalAssets 
SELECT 1, 
     2000 
UNION 
SELECT 1, 
     1000 
UNION 
SELECT 2, 
     600 

--Select * From @TotalAssets 

INSERT INTO @TotalLiability 
SELECT 1, 
     1000 
UNION 
SELECT 1, 
     1000 
UNION 
SELECT 2, 
     800 

--Select * From @TotalLiability 

SELECT * 
FROM @Customer 
SELECT C.CustID, 
     C.CustomerName, 
     Sum(A.Amount) TotalAssets, 
     Sum(L.Amount) TotalLiability 
FROM @Customer C 
JOIN @TotalAssets A ON C.CustID = A.CustID 
JOIN @TotalLiability L ON C.CustId = L.CustID 
GROUP BY C.CustID, 
     C.CustomerName 
+0

UNION ALLの代わりにUNIONを使用すると、不正なテストデータが表示されます。また、私はこれはとにかく正しい結果を与えるとは思わない - あなたはそれをテストするときにOPの必要な出力に一致する出力はありますか? – Blorgbeard

+0

それは私のために働いた。 Pl。あなたの最後から試してみてください。 – Lucky

+0

テストデータが間違っているため「動作します」のみです。 'select * from @ TotalLiability'を実行します - 重複した行が挿入されていないことに注意してください。あなたの 'union'は' all union 'でなければならないからです。 – Blorgbeard

-1

はこれを試してみてください:

select R.CustID, sum(R.AA), sum(R.AL) from (
select c.CustID, null AA, sum(a.amount) AL 
From @Customer c 
left join @TotalAssests a on a.CustID = c.CustID 
Group by c.CustId 
union all 
select c.CustID , sum(l.amount) AA, null AL 
From @Customer c 
left join @TotalLiability l on l.CustID = c.CustID 
Group by c.CustId) R group by R.CustID 
関連する問題