2014-04-08 60 views
0

如果最近的銷售沒有記錄任何價值,我想根據特定的時間範圍(9到3個月前)找到數據庫中以前記錄的平均值。原因是我們網站上的最近銷售有時不會立即收取佣金,因此我需要回到歷史記錄以找出佣金估算值。計算MySQL自己加入以獲取平均數

佣金率如下:

total_commission/gross_sales 

它是隻需要找出一個估計會是什麼,如果近期的銷售有記錄

這裏沒有「total_commission」是我費了很大的到目前爲止,但我認爲這是錯誤的:

SELECT 
    cs.* 
    ,SUM(cs2.gross_sales) 
    ,SUM(cs2.total_commission) 
    FROM 

    (SELECT 
     sale_id 
    , date 
    , customer_code 
    , customer_country 
    , gross_sales 
    , total_commission 
    FROM customer_sale cs) cs 

    LEFT JOIN customer_sale cs2 
    ON cs2.customer_code = cs.customer_code 
    AND cs2.customer_country = cs.customer_country 
    AND cs2.date > cs.date - interval 9 month 
    AND cs2.date < cs.date - interval 3 month 

    GROUP BY cs.sale_id 

,這樣的數據將被結構如下:

sale_id date   customer_code customer_country gross_sales total_commission 
1  2013-12-01 cust1   united states 10000  1500 
2  2013-12-01 cust2   france   20000  3000 
3  2013-12-01 cust3   united states 15000  2250 
4  2013-12-01 cust4   france   14000  2100 
5  2013-12-01 cust5   united states 13000  1950 
6  2013-12-01 cust6   france   12000  1800 
7  2014-04-02 cust1   united states 10000 
8  2014-04-02 cust2   france   20000 
9  2014-04-02 cust3   united states 15000 
10  2014-04-02 cust4   france   14000 
11  2014-04-02 cust5   united states 13000 
12  2014-04-02 cust6   france   12000 

所以我需要的輸出結果從類似這樣的查詢:(基於同一customer_country 9和3個月前與銷售來自同一customer_code)

sale_id date   customer_code customer_country gross_sales total_commission gross_sales_past total_commission_past 
1  2013-12-01 cust1   united states 10000  1500 
2  2013-12-01 cust2   france   20000  3000 
3  2013-12-01 cust3   united states 15000  2250 
4  2013-12-01 cust4   france   14000  2100 
5  2013-12-01 cust5   united states 13000  1950 
6  2013-12-01 cust6   france   12000  1800 
7  2014-04-02 cust1   united states 10000      10000   1500 
8  2014-04-02 cust2   france   20000      20000   3000 
9  2014-04-02 cust3   united states 15000      15000   2250 
10  2014-04-02 cust4   france   14000      14000   2100 
11  2014-04-02 cust5   united states 13000      13000   1950 
12  2014-04-02 cust6   france   12000      12000   1800 
+0

考慮提供適當的DDL(和/或sqlfiddle)連同SET – Strawberry

+0

+1所期望的結果。不知道爲什麼這個問題是downvoted,或爲什麼投票結束,因爲OP問題是非常明確的。 (我們可能有幾個問題,比如customer_sales表中的sale_id是唯一的(它看起來像是PRIMARY KEY,但我們可以注意到我們正在做出這個假設。) – spencer7593

回答

0

你的查詢看起來基本上是正確的,但我認爲您的外部查詢需要爲GROUP BY cs.sale_id(假設sale_id在customer_sale表中是唯一的,並且假設date列的數據類型爲DATE,DATETIME或TIMESTAMP)。

我想你想包含一個連接謂詞,這樣你只匹配「過去」行到你沒有總佣金的那些行,

AND cs.total_commission IS NULL 

而我不認爲你真的需要內聯視圖。


這就是我想出了:

SELECT cs.sale_id 
    , cs.date 
    , cs.customer_code 
    , cs.customer_country 
    , cs.gross_sales 
    , cs.total_commission 
    , SUM(ps.gross_sales) AS gross_sales_past 
    , SUM(ps.total_commission) AS total_commission_past 
    FROM customer_sale cs 
    LEFT 
    JOIN customer_sale ps 
    ON ps.customer_code = cs.customer_code 
    AND ps.customer_country = cs.customer_country 
    AND ps.date > cs.date - INTERVAL 9 MONTH 
    AND ps.date < cs.date - INTERVAL 3 MONTH 
    AND cs.total_commission IS NULL 
GROUP 
    BY cs.sale_id 

適當的索引可能會提高查詢性能。可能的是,EXPLAIN輸出將顯示「Using temporary; Using filesort」,並且對於大集合來說可能是昂貴的。

MySQL將有可能能夠利用覆蓋索引爲JOIN:

... ON customer_sale (customer_code,customer_country,date,gross_sales,total_commission). 
+0

感謝您的快速響應。使用顯示空值爲空,所以我必須使用AND cs.total_commission =''你也認爲有一種方法來加快這個查詢,即創建索引或改變查詢本身,因爲我正在與約50萬行 - 需要很長時間來執行你的查詢 – deepheat

+0

MySQL應該能夠使用適當的索引來提高JOIN操作的性能......在customer_sale(customer_code,customer_county,date,gross_sales,total_commission)'上。 'EXPLAIN'輸出可能會顯示「Using temporary; Using filesort」,並且在大集合上可能會很昂貴。 – spencer7593

+0

在適當的字段上創建索引之後,這個查詢對於50萬條記錄來說太慢了,所以我們將創建另一個表,該表爲每個代碼和國家組合存儲佣金平均值 – deepheat