2011-10-31 82 views
-1

我們有一個'報告生成器',它基本上建立了一系列基於用戶選擇的選項的MySQL查詢。來自一系列查詢的數據被用來繪製圖表。我們運行了一個基於SUM返回不正確值的報表。下面是該查詢(我不知道是否有代碼在這個網站格式化,所以我只是將其粘貼):MYSQL問題與DISTINCT SUM

SELECT DISTINCT SUM(pp.EffectivePrice) 
FROM quotes qu 
LEFT JOIN plans pl ON pl.ID = qu.planID AND qu.active_quote = '1' 
LEFT JOIN plan_procedures pp ON pp.QuoteID = qu.ID AND qu.active_quote = '1' 
LEFT JOIN patients pt ON pt.ID = pl.patientID 
LEFT JOIN events_log el7881 ON el7881.TreatmentID = pl.ID 
LEFT JOIN events_log el9205 ON el9205.TreatmentID = pl.ID 
WHERE el7881.LogDate >= '2011-01-01 00:00:00' AND ((el7881.CurrStageID != '5' AND pt.ID != '') AND (el7881.CurrStageID != '19' AND pt.ID != '')) AND (((CAST(pl.surgery_date AS DATE) BETWEEN '2011-01-01' AND '2011-01-31' AND pl.surgery_date != '') OR (pl.LastSurgeryDate != '0000-00-00 00:00:00' AND CAST(pl.LastSurgeryDate AS DATE) BETWEEN '2011-01-01 00:00:00' AND '2011-01-31 23:59:59')) AND pt.ID != '') AND el9205.LogDate <= '2011-01-31 23:59:59' AND ((el9205.CurrStageID = '4' AND el9205.PrevStageID != '4' AND pt.ID != '')) AND qu.active_quote = '1' AND (pl.doctorID = '6' OR pl.doctorID = '9' OR pl.doctorID = '13') 

查詢由PHP腳本自動生成的,所以它是令人費解。但是這裏的問題很簡單:當我運行此查詢時,爲什麼結果值與我在不使用'SUM()'的情況下運行相同查詢時不同,並且只是手動將值添加到了?當我手動添加它們時,結果是正確的,但'SUM()'的結果比它應該高。預先感謝您的幫助。

回答

1

SELECT DISTINCT只返回唯一的行。您的查詢儘管涉及很高,但在使用SUM()版本時僅返回單個字段的單個行。

當您執行SELECT DISTINCT pp.EffectivePrice時,您將消除碰巧具有相同EffectivePrice值的任何行。

因此,考慮到一些假返回數據

$1.00 
    $2.00 
    $1.00 
    $3.00 

的DISTINCT將隱藏重複$ 1.00包裝的結果,你的總和爲$ 1 + $ 60 + $ 3 = $ 6,它是現在$ 1從實際短總。

0

當您選擇使用DISTINCT時,您會得到不同的值。任何雙打被刪除。因此,如果沒有DISTINCT的查詢將返回:1, 3, 4, 4, 5, 3, 6

然後使用DISTINCT將使其返回1, 3, 4, 5, 6

您在SUM之外使用了DISTINCT,因此所有數字(包括雙精度)都被累加起來,然後您將得到結果的DISTINCT值,該值已經是一個數字。換句話說,DISTINCT在您的查詢中不會執行任何操作。

現在,如果你願意:SELECT SUM(DISTINCT pp.EffectivePrice),那麼你會加起來所有截然不同的價格。

但實際上,這可能並不正確。你確定你不想要總數的總和嗎?我認爲你根本不應該使用DISTINCT。

+0

奇怪地刪除DISTINCT給了我完全相同的結果(太高)。另一方面,在SUM()中移動DISTINCT會給出比預期更小的值。我不明白。 – user1022643

+0

刪除DISTINCT將爲您提供與我所解釋的相同的值。在SUM內移動DISTINCT可以爲您提供不同值的總和。如果你這樣做,它應該給你同樣的結果,如果你只有DISTINCT,沒有SUM,並且自己加上了這些值。 – GolezTrol