2017-05-09 31 views
1

我有一個查詢,我似乎被卡住,我不知道如何解決這個問題。它只是在查詢的中間部分將我拋棄。我只是想用一個左連接來計算和總結一個字段的總成本,並且總和是正確的。我相信問題是如果在同一張桌子上有超過1個與該賬戶相關的項目,它將總結多次,總額將不正確。這裏是我與....左加入正確的總數,經過計數和總和挑戰

left join 
(select distinct (soid), count(*) as oaccount, sum(amount) as c3 from 
soorderdetails where soorderdetails.description like 'Installation%' or 
soorderdetails.description like 'Training%' or soorderdetails.description 
like 'Fusion Report%' group by soid) as o on o.soid=s.soid 


The result I would like to obtain is: 
    Job# | (c3) | Soid 
    ----- | -----|----- 
    223 | 2000 | 212 (1 record - c3 amount - 1=2000) 
    224 | 300 | 213 (2 record - c3 amount - 1=100 + 2=200) 
    225 | 4333 | 214 (1 record - c3 amount - 1=4333) 
    226 | 1000 | 215 (3 record - c3 amount - 1=200 + 2=300 + 3=500) 

    But I am getting this.... 

    Job# | (c3) | Soid 
    -----| -----|----- 
    223 | 2000 | 212 (1 record...sum is correct here) 
    224 | 600 | 213 (2 record - 1=100x2 + 2=200x2)=WRONG 
    225 | 4333 | 214 (1 record...sum is correct here) 
    226 | 2500 | 215 (3 record - 1=200x3 + 2=300x3 + 3=500x3)=WRONG 

我正在尋找的是與(C3)場的每個不同的總和一起顯示所有不同(soid)記錄奮力一節( soid)記錄。

所以用上面的查詢,我可以看到C3的總和顯示。如果只有1條記錄,那麼總和顯示正確,如果有超過1條記錄,則記錄數將乘以找到的soid匹配的數量,然後一起加上總和值。我試圖採用一些在這裏找到的解決方案,但仍然無法正確顯示它。任何人都可以提供幫助嗎?先進的謝謝!

  • 表1具有匹配soid id字段(s.soid)
  • 表2具有soid,描述和量字段(o.soid)

  • 我試圖左連接表2到表1通過使用soid字段。

  • 我想正確地總結金額領域。現在看來,每個'金額'總和乘以該記錄的計數值。謝謝!

下面是完整的查詢......

SELECT DISTINCT (jobnumber) as l1, 
       c2 as l2, 
       sum(isnull(c3,0)) as l3, 
       sum((isnull(c3,0)/150)*50) as l4, 
       sum(c5) as l5, sum(c6) as l6,sum(c5+c6) as l7, 
       sum(c5*25.27) as l8, 
       isnull(c9,0) as l9, 
       (sum(c5*25.27)+(isnull(c9,0))) as l10, 
       sum((isnull(c3,0)/150)*50)-(sum(c5*25.27) 
             +(isnull(c9,0))) as l11 , 
       sum(isnull(c3,0))-(sum(c5*25.27)+(isnull(c9,0))) as l12 
FROM (
     SELECT DISTINCT (j.jobnumber), 
         customername as c2, 
         c3, 
         c5, 
         c6, 
         c9 
     FROM dbo.SOOrders as s 
     LEFT JOIN (
       SELECT DISTINCT (jobid), 
            COUNT(*) as s9, 
            sum(total) as c9 
       FROM apvouchers 
       GROUP BY jobid 
       ) as v ON v.jobid = s.jobid 
     LEFT JOIN (
       SELECT DISTINCT (soid), 
            COUNT(*) as oaccount, 
            SUM(amount) as c3 
       FROM soorderdetails 
       WHERE description LIKE 'Installation%' 
        OR description LIKE 'Training%' 
        OR description LIKE 'Fusion Report%' 
       GROUP BY soid 
       ) as o ON o.soid = s.soid 
     INNER JOIN sccalls as t ON t.jobid = s.jobid 
     INNER JOIN (
        SELECT DISTINCT(callid), 
            COUNT(*) as myaccount, 
            SUM(actualhours) as c5, 
            SUM(overtimehours) as c6 
        FROM scqreportlabors 
        WHERE actualhours > 0 
        GROUP BY callid 
       ) as r ON r.callid = t.callid 
     LEFT JOIN ShAgents ON AgentID = TechnicianID 
     LEFT JOIN arcustomers as c ON c.customerid = s.customerid 
     INNER JOIN icjobs as j ON j.jobid = s.jobid 
     WHERE j.active = 1 
    ) as x 
GROUP BY jobnumber, c2, c9 
ORDER BY jobnumber DESC 
+2

請添加示例數據和預期輸出。 – Kevin

+0

向我們展示數據庫模式,樣本數據和預期輸出。 \t請閱讀[**如何提問**](http://stackoverflow.com/help/how-to-ask) \t \t這裏是一個偉大的地方[** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)來了解如何提高您的問題質量並獲得更好的答案。 \t [**如何創建一個最小的,完整的,並且可驗證例如**](http://stackoverflow.com/help/mcve) \t嘗試創建http://rextester.com –

+0

一個什麼樣只有在針對'soorderdetails'表運行子查詢時纔會得到結果? c3會返回預期的結果嗎?如果你的問題存在於子查詢中,那麼它與你的'LEFT JOIN'無關,因爲你所顯示的括號內的所有內容都是獨立的。一個問題子查詢會提示你要麼不明白'amount'字段中存儲了什麼,要麼你對該表有一個規範化問題。 – DanK

回答

0

有兩件事情會在這裏......

你不需要DISTINCT(在你的主選擇)和GROUP BY,這是多餘的。分組就已經做出記錄不同:

LEFT JOIN 
(SELECT soid, COUNT(*) as oaccount, SUM(amount) as c3 
    FROM soorderdetails 
    WHERE soorderdetails.description like 'Installation%' 
    OR soorderdetails.description like 'Training%' 
    OR soorderdetails.description like 'Fusion Report%' 
    GROUP BY soid 
) AS o ON o.soid = s.soid 

我想你所追求的,是添加DISTINCT修改您SUM(amount)只總和唯一值SUM(DISTINCT amount)相當於:

LEFT JOIN 
(SELECT soid, COUNT(*) as oaccount, SUM(DISTINCT amount) as c3 
    FROM soorderdetails 
    WHERE soorderdetails.description like 'Installation%' 
    OR soorderdetails.description like 'Training%' 
    OR soorderdetails.description like 'Fusion Report%' 
    GROUP BY soid 
) AS o ON o.soid = s.soid 

那所有說...基於此:

但是,如果有多個記錄,'金額'得到 乘以記錄

我猜你不想總和在所有號碼:

LEFT JOIN 
(SELECT soid, COUNT(*) as oaccount, amount as c3 
    FROM soorderdetails 
    WHERE soorderdetails.description like 'Installation%' 
    OR soorderdetails.description like 'Training%' 
    OR soorderdetails.description like 'Fusion Report%' 
    GROUP BY soid, amount 
) AS o ON o.soid = s.soid 

這將是巨大的,因爲SUM(DISTINCT..)操作真的破壞性能。

+0

感謝您的建議和示例。我很感激你花時間看看它。我可能在一開始就解釋錯了,但我想我現在已經更新了我正在尋找的信息。我想要實際的總和,但沒有多個記錄顯示爲上面提出的查詢,我認爲我現在更好地解釋了我所瞄準的新版本。再次感謝,任何建議都會有所幫助。 – Missingsiam

+0

@Missingsiam沒問題。如果你只運行這個左連接的內部選擇(派生表)部分,你仍然得到錯誤的「SUM(數量)」?或者只有在運行主查詢後纔會出錯? –

+0

@Missingsiam直到明天我才能再次使用,但基本上有兩件事情中的一件正在發生。如果您嘗試我以前的評論,並運行內部選擇,並且值被重複,則將其更改爲「SUM(DISTINCT amount)」以修復該表重複。如果這些值是正確的,那麼主要查詢中的某些內容會導致重複,因此我們必須查看整個事情。 :D –