2016-02-04 71 views
0

尋找關於此的一些指導。我試圖在我的投訴管理系統中運行一個報告。按年份,地點,子類別,TotalCredits(子表)和TotalsCwts(子表)以及總ExternalRootCause(在主表上)顯示總計。SQL 2帶外加和分組的012左外連接

這是我的SQL,但TotalCwts和TotalCredits計算不正確。它爲每個子記錄計算1次,而不是每個主記錄的總計。

SELECT 
    dbo.Complaints.Location, 
    YEAR(dbo.Complaints.ComDate) AS Year, 
    dbo.Complaints.ComplaintSubcategory, 
    COUNT(Distinct(dbo.Complaints.ComId)) AS CustomerComplaints, 
    SUM(DISTINCT CASE WHEN (dbo.Complaints.RootCauseSource = 'External') THEN 1 ELSE 0 END) as ExternalRootCause, 
    SUM(dbo.ComplaintProducts.Cwts) AS TotalCwts, 
    Coalesce(SUM(dbo.CreditDeductions.CreditAmount),0) AS TotalCredits 

FROM dbo.Complaints 
    JOIN dbo.CustomerComplaints 
    ON dbo.Complaints.ComId = dbo.CustomerComplaints.ComId 
    LEFT OUTER JOIN dbo.CreditDeductions 
    ON dbo.Complaints.ComId = dbo.CreditDeductions.ComId 
    LEFT OUTER JOIN dbo.ComplaintProducts 
    ON dbo.Complaints.ComId = dbo.ComplaintProducts.ComId 

WHERE 
    dbo.Complaints.Location = Coalesce(@Location,Location) 

GROUP BY 
    YEAR(dbo.Complaints.ComDate), 
    dbo.Complaints.Location, 
    dbo.Complaints.ComplaintSubcategory 
ORDER BY 
    [YEAR] desc, 
    dbo.Complaints.Location, 
    dbo.Complaints.ComplaintSubcategory 

的數據結果

Location | Year | Subcategory | Complaints | External RC | Total Cwts | Total Credits 
--------------------------------------------------------------------------------------- 
Boston | 2016 | Documentation |  1 |  0  |  8  | 8.00 

數據應閱讀

Location | Year | Subcategory | Complaints | External RC | Total Cwts | Total Credits 
--------------------------------------------------------------------------------------- 
Boston | 2016 | Documentation |   1 |  0  |  4  | 2.00 

以上數據反映1個投訴有4條1cwt每個產品記錄,並與各1.00 2個的信用記錄。

我需要在我的查詢中更改什麼,或者我應該以不同方式處理此查詢?

回答

0

問題是1投訴有2個扣除和4個產品。當你以這種方式加入時,它會返回扣分/產品的所有組合,爲您提供8行的投訴。

應該在這裏工作的一個解決方案是不直接查詢Dedustion和Product表;查詢每個投訴每個表返回一行的查詢。換句話說,替換:

  LEFT OUTER JOIN dbo.CreditDeductions ON dbo.Complaints.ComId = dbo.CreditDeductions.ComId 
      LEFT OUTER JOIN dbo.ComplaintProducts ON dbo.Complaints.ComId = dbo.ComplaintProducts.ComId 

...本 - 僅扣減表顯示,你可以制定出產品:

LEFT OUTER JOIN (
    select ComId, count(*) CountDeductions, sum(CreditAmount) CreditAmount 
    from dbo.CreditDeductions 
    group by ComId 
) d on d.ComId = Complaints.ComId 

你必須改變引用DBO。 CreditDedustions只是d(或任何你想稱之爲的)。

一旦你完成了他們兩個,那麼你會每投訴一個,這將導致每個投訴1行包含兩個子表的計數和總數。