2016-08-04 33 views
0

我有我的數據庫3個表: -SQL服務器的多個JOIN:避免重複值

客戶:

CId | CName | CLocation | CJoinDate 

付款方式:

TxnId | TxStatus | TxComment | TxAmount | CId | TxDate 

約會:

AppId | AppCode | CId | ADate | AComment 

當我做了兩個表格的左連接那麼計算結果就會正確。但是當我嘗試與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; 

在上面的查詢中,我只是將兩個表,給了我正確的結果。

現在,當我想在一張表中顯示所有的記錄,所以我不得不加入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; 

上面的查詢給了我錯了付款金額爲每一個客戶。導致錯誤結果的原因是與每個客戶的付款表相比,約會表具有更多的行。因此,要顯示所有的約會條目,付款金額會得到重複計算錯誤。

如何解決上述情況與上述查詢。

韓國社交協會

編輯:其實那裏有2-3多個表,我有一個GROUP BY每月子句一起加入類同委任表格。

編輯1:修復它由多個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

其實我有多個表加入。上述查詢只是一個大問題的小問題。所以我想知道如果我們能夠用JOIN來解決問題,我們可以做些什麼。 – Villie

+0

好的,你也可以爲其他表使用子查詢。考慮使用子查詢和Pawel的CTE變體編寫查詢。那麼使用執行計劃成本最低的那個? –

+0

我們是否可以使用帶有GROUP BY子句的CTE或子查詢,因爲我已經顯示給定年份的每個月的總數。 – Villie

1

使用一個簡單的CTE表達式,如果你確信你的總和由第一查詢

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

您可以爲每個識別符計算total_visit正確計算然後加入子查詢

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;