2016-08-04 12 views
0

重複した値を避ける: -SQL ServerのMULTIPLE JOINは:私は私のデシベルで3つのテーブルを持っている

お客様:

CId | CName | CLocation | CJoinDate 

お支払い方法:

TxnId | TxStatus | TxComment | TxAmount | CId | TxDate 

予定:

AppId | AppCode | CId | ADate | AComment 

2つのtablで左結合を行うと計算された結果が正しく表示されます。しかし、3つのテーブルを使って結合しようとすると、計算結果が間違っています。例えばのための

: -

私はこのクエリを試す場合は、算出した合計金額が正しい:上記のクエリで

SELECT c.CName, sum(p.TxAmount) 
FROM Customer c LEFT JOIN Payment p ON c.CId = p.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName; 

私はちょうど私に正しい結果を与える2つのテーブルを結合しています。

ここで、すべてのレコードを1つのテーブルに表示したいので、3つのテーブルを結合する必要がありました。以下 は、私が試したクエリです:

SELECT c.CName as Name, sum(p.TxAmount) as Payment, count(distinct a.ADate) as Total_Visit 
FROM Customer c LEFT JOIN Payment p ON c.CId = p.CId LEFT JOIN Appointment a ON c.CId = a.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName; 

上記のクエリは、各顧客のために私に間違ったお支払い金額を与えます。間違った結果が得られる理由は、各顧客の支払いテーブルと比較してAppointmentsテーブルの行数が増えたためです。したがって、すべての予定エントリを表示するには、支払い金額が重複して計算が間違ってしまうことがあります。

上記のシナリオを上記のクエリで修正するにはどうすればよいですか。

TKS

EDIT:実は、私は、各月のGROUP BY句と一緒に予定表に似参加する必要があり、2-3複数のテーブルをtheresの。

EDIT1:複数のCTEで修正されました。あなたの貴重な点をお寄せいただき、ありがとうございました。

答えて

0

てみサブクエリを使用するには:

SELECT 
c.CName as Name 
, sum(p.TxAmount) as Payment 
, Total_Visit = (SELECT count(distinct a.ADate) FROM Appointment a ON c.CId = a.CId) 
FROM Customer c 
LEFT JOIN Payment p ON c.CId = p.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName; 
+0

実際には、複数のテーブルを結合しています。上記のクエリは大きな問題のほんの小さな問題です。だから私は物事を修正するためにJOINsでできることがあるかどうかを知りたかった。 – Villie

+0

他のテーブルに対してもサブクエリを使用することができます。サブクエリーとPawelのCTEバリアントを使用してクエリを作成することを検討してください。実行計画のコストが最も低いものを使用しますか? –

+0

GROUP BY句でCTEまたはサブクエリを使用することはできますか?特定の年の各月の合計を表示しています。 – Villie

1

あなたの合計が最初のクエリ

WITH cte AS 
(
SELECT c.CName, c.CID, sum(p.TxAmount) AS sumAmount 
FROM Customer c LEFT JOIN Payment p ON c.CId = p.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName, c.CID 
) 
SELECT cte.CName, cte.sumAmount, count(distinct a.ADate) as Total_Visit 
FROM cte LEFT JOIN Appointment a ON c.CId = a.CId 
GROUP BY c.CName, cte.sumAmount 
0

によって正しく計算されますが、CIDごとtotal_visitを計算できることを確信している場合は、単純なCTE式を使用しますサブクエリに参加します。

SELECT 
    c.CName as Name 
, sum(p.TxAmount) as Payment 
, Total_Visit 
FROM Customer c 
LEFT JOIN Payment p ON c.CId = p.CId 
LEFT JOIN (SELECT a.CId, count(distinct a.ADate) Total_visit FROM Appointment a group by a.CId) as a on c.CId = a.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName; 
関連する問題