2012-07-20 28 views
0

我已經寫了其中連接三個表的客戶表,計算各個字段的值的查詢集合函數,並返回銷售和收入由銷售代表細分的概述:左聯接和使用次數,如果

SELECT 
    u.id AS `userId`, 
    u.`username`, 
    (SELECT COUNT(*) FROM `SaleSet` s WHERE s.`pitchedBy_id` = `userId` AND s.setCompleteAt BETWEEN '2012-07-02 00:00:00' AND '2012-07-02 23:59:59') AS `transfers`, 
    COUNT(c.id) AS `closes`, 
    COUNT(IF(c.saleType_id = 1, 1, NULL)) AS `regS_sales`, 
    COUNT(IF(c.saleType_id = 2, 1, NULL)) AS `pd_sales`, 
    COUNT(IF(c.saleType_id = 4, 1, NULL)) AS `attempted_sales`, 
    COUNT(IF(c.CustomerStatus_id IN (5,6,9,16), 1,NULL)) AS `complete`, 
    COUNT(IF(c.CustomerStatus_id IN (8,18), 1,NULL)) AS `canceled`, 
    COUNT(IF(c.CustomerStatus_id IN (1,12,13), 1,NULL)) AS `pending`, 
    COUNT(IF(c.CustomerStatus_id = 20, 1,NULL)) AS `post_dated`, 
    SUM(IF(p.saleType_id = 2, p.`authOnlyAmount`,0)) AS `pdPotRev`, 
    #SUM(IF(c.saleType_id = 2 AND t.`captured` = 0, p.`authOnlyAmount`,0)) AS `pdCapRev`, 
    SUM(t.amount) AS `fwRevAuthed`, 
    SUM(IF(p.saleType_id = 2 AND t.`captured` = 0, t.amount,0)) AS `fwCaptured` 
FROM customer c 
LEFT JOIN `User` u ON u.id = c.`salesRep_id` 
LEFT JOIN `Transaction` t 
    ON t.`customer_id` = c.`id` 
    AND t.transactionType = 'Auth' 
LEFT JOIN `Purchase` p ON p.`customer_id` = c.`id` 
#WHERE c.`salesRep_id` = 10 
WHERE c.`activationDate` BETWEEN '2012-07-02 00:00:00' AND '2012-07-02 23:59:59' 
GROUP BY u.`id` 

爲什麼此列返回0而不是t.amount之和:SUM(IF(p.saleType_id = 2 AND t.captured = 0, t.amount,0)) AS fwCaptured?正如你所看到的,我做了上面兩行完全一樣的東西,它工作正常。

下面是結果的一個例子:

userId username   transfers closes regS_sales pd_sales attempted_sales complete canceled pending post_dated pdPotRev fwRevAuthed fwCaptured 
10 doughaase    17  4   3   1    0   4   0  0   0  50.00  298.00   0.00 
65 davidgarber    13  5   5   0    0   4   0  0   0  0.00  595.00   0.00 
70 morgantaylor    5  2   2   0    0   0   2  0   0  0.00  198.00   0.00 
76 shayans     8  1   0   1    0   1   0  0   0  99.00  99.00   0.00 
96 regananson    5  3   3   0    0   3   0  0   0  0.00  248.00   0.00 

的pdPotRev使用在完全相同的方式完全相同的功能和完美。

+0

此外,它沒有什麼區別如果我指定t.captured = 0或1。 – 2012-07-20 21:49:46

回答

2

也許t.amount爲0,對於每個被捕獲的類型2的銷售,甚至可能是正值和負值均勻。 在上面的字段中,你正在總結一個不同的字段,所以它返回一個不同的值是有道理的。你甚至可以從完全不同的表中選擇。

如果有疑問,請刪除總和和分組,然後選擇值。你應該能夠馬上發現問題。

甚至不成立。 pdPotRev根本不使用p.captured字段。包含相同條件的行是pdCapRev,它被註釋掉了。所以最有可能的是IF(p.saleType_id = 2 AND t.captured從來沒有評估爲真。

+0

我改變p.saleType_id到c.saleType_id(這兩個值是相同的),但c是原來的客戶表即時選擇從。 – 2012-07-20 21:53:06

+0

加入事務處理表兩次是明智的,一次是捕獲的事務,另一次是沒有? – 2012-07-20 22:10:20

+0

取決於你想要的東西。我看不到你的數據,我不知道每個領域的意義。 – GolezTrol 2012-07-20 22:14:03