2015-03-31 106 views
0

我正在開發一個php/mysql數據庫。我有兩張桌子 - 事情和行動。 在其他領域中,事項表包含'事件''fixedfee'和'費用'。固定費用是Y或N,費用可以是任何數字。MySQL SUM()給出不正確的總數

對於任何事情都可以有一些行動。動作表中包含'actionid''事件''advicetime''advicefee'。建議時間是建議的持續時間(十進制格式),advicefee是一個數字。因此,爲了解決我使用SUM(advicetime * advicefee)的建議的成本。

我想要做的就是在'fixedfee'= Y時加上所有'費用'值,並且也是所有這些事情的所有SUM(advicetime * advicefee)值的總和。

我已經嘗試使用:

SELECT 
     SUM(matters.fee) AS totfixed, 
     SUM(advicetime*advicefee) AS totbills, 
    FROM matters 
    INNER JOIN actions 
     ON matters.matterid = actions.matterid 
    WHERE fixedfee = 'Y' 

但是這並不爲(我認爲),它的工作是增加了matters.fee爲每次有一個動作。我自己也嘗試使其

SUM(DISTINCT matters.fee) AS totfixed 

但是這並不因爲我認爲這似乎缺少了任何相同的費用(和存在具有相同的固定費若干事項)工作。

我對此很新,所以任何幫助都會非常受歡迎。

+0

您能否在http://sqlfiddle.com/上提供您的問題和期望輸出的工作示例? – Havenard 2015-03-31 23:19:04

+0

先選擇'matters.fee'列,看看它是否有正確的數據。 – zerkms 2015-03-31 23:21:08

+0

固定費用只應收取一次費用,無論有多少行爲是針對此事的? – 2015-03-31 23:25:16

回答

1

但這不起作用(我認爲)它是每次有動作時加起來的事情。我也試圖讓它...

您正在體驗aggregate fanout issue。只要select查詢中的主表的行數少於它所連接的輔助表的行數,就會發生這種情況。連接導致重複行。所以,當應用聚合函數時,它們會對額外的行進行操作。

這裏的主表是指應用聚合函數的表。在你的例子中,
* SUM(matters.fee) >>表matters上的聚合。
* SUM(advicetime*advicefee) >>上表actions
* fixedfee='Y' >>凡表matters

條件爲避免扇出的問題彙總:
*骨料總是適用於最精細的表聯接。
*除非兩個表具有一對一的關係,否則不要在兩個表的字段上應用聚合函數。
*通過不同的子查詢分別獲得聚合,然後合併結果。這可以在SQL語句中完成,也可以導出數據然後執行。

查詢1:

SELECT SUM(fee) AS totfixed 
FROM matters 
WHERE fixedfee='Y' 

查詢2:

SELECT SUM(actions.advicetime*actions.advicefee) AS totbills 
FROM matters 
JOIN actions ON matters.matterid = actions.matterid 
WHERE matters.fixedfee = 'Y' 

Query 1 & Query 2不從扇出苦。在這一點上,你可以導出它們並在php中處理結果。或者你也可以在SQL將它們組合起來:

SELECT query_2.totbills, query_1.totfixed 
FROM (SELECT SUM(fee) AS totfixed 
    FROM matters 
    WHERE fixedfee='Y') query_1, 

    (SELECT SUM(actions.advicetime*actions.advicefee) AS totbills 
    FROM matters 
    JOIN actions ON matters.matterid = actions.matterid 
    WHERE matters.fixedfee = 'Y') query_2 

最後,SUM不採取關鍵字DISTINCTDISTINCT僅適用於COUNTGROUP_CONCAT聚合函數。以下是一條無效的SQL

SUM(DISTINCT matters.fee) AS totfixed 
+0

完美運作。非常感謝你的回答和明確的解釋。 – 2015-04-05 09:41:04

+0

謝謝 - 我現在已經這樣做了。 – 2015-04-06 15:51:50