0

3つのテーブルを顧客テーブルに結合し、さまざまなフィールドの値をカウントし、営業担当者ごとに分類された売上と収益の概要を返すクエリを作成しました。

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`

この列がt.amountの合計ではなく0を返すのはなぜSUM(IF(p.saleType_id = 2 AND t.captured = 0, t.amount,0)) AS fwCapturedですか?ご覧のとおり、上記の2行でまったく同じことを実行し、正常に動作します。

結果の例を次に示します。

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は、まったく同じ機能をまったく同じ方法で使用しており、完全に機能します。

4

1 に答える 1

2

おそらく、タイプ 2 のキャプチャされた売上ごとに t.amount が 0 になるか、正の値と負の値が均等になる可能性さえあります。上記のフィールドでは、別のフィールドを合計しているので、別の値を返すことは理にかなっています。まったく別のテーブルから選択することもできます。

疑わしい場合は、合計とグループ化を削除し、値のみを選択してください。問題をすぐに特定できるはずです。

[編集] 真実でもありません。pdPotRev は p.captured フィールドをまったく使用しません。同じ条件を含む行はpdCapRevで、コメント アウトされています。IF(p.saleType_id = 2 AND t.capturedそのため、 が true に評価されない可能性が最も高いです。

于 2012-07-20T21:45:03.267 に答える