2013-10-18 158 views
0

我想根據表(歷史)SUM得到的結果,其中用戶名包含'紅色'並按月分組。在這裏查詢:SUM DISTINCT MYSQL | WHERE CLAUSE

select month(date), 
SUM(CASE WHEN status='success' THEN 1 ELSE 0 END) as total_sucess, 
SUM(CASE WHEN status='failed' THEN 1 ELSE 0 END) as total_failed 
from history 
where date between '201305%' AND '201311%' AND username like '%@red%' 
GROUP BY month(history.date); 

結果:

+------------+--------------+--------------+ 
| month(date) | total_sucess | total_failed | 
+------------+--------------+--------------+ 
|   5 |  10960 |   3573 | 
|   6 |   2336 |   1202 | 
|   7 |   2211 |   1830 | 
|   8 |   5312 |   3125 | 
|   9 |   9844 |   5407 | 
|   10 |   6351 |   3972 | 
+------------+--------------+--------------+ 

的問題是,如何獲取不同total_success和total_failed SUM?只是在一個查詢?

我已經使用這個

select month(tgl), 
SUM(CASE WHEN status='success' THEN 1 ELSE 0 END) as total_sucess, 
SUM(DISTINCT (username) CASE WHEN status='success' THEN 1 ELSE 0 END) as distinct_total_sucess, 
SUM(CASE WHEN status='failed' THEN 1 ELSE 0 END) as total_failed, 
SUM(DISTINCT (username) CASE WHEN status='failed' THEN 1 ELSE 0 END) as distinct_failed_sucess 
from history_auth 
where tgl between '201305%' AND '201311%' AND username like '%@t.sel%' 
GROUP BY month(history_auth.tgl); 

,但得到錯誤的SQL語法試過......我有這個:(不知道

+0

我不明白這個問題。你的意思是對於每個用戶名,只計算1次成功和1次失敗? – Barmar

+0

發佈您的例外結果 –

+0

如果這就是你想要的,你需要編寫一個按用戶名,狀態和月份分組的子查詢。 – Barmar

回答

3

最好的我可以做出來的你的要求是,你想要的每個月是成功不同的用戶名/失敗的次數。

如果是這樣,我認爲你需要一雙子選擇來獲取這些數字。

Rejigged查詢(添加nother sub選擇獲得6個月,而不是依賴所有月份的代表。

SELECT Sub1.aMonth, 
SUM(CASE WHEN history.status='success' THEN 1 ELSE 0 END) as total_sucess, 
SUM(CASE WHEN history.status='failed' THEN 1 ELSE 0 END) as total_failed, 
IFNULL(SuccessCount, 0), 
IFNULL(FailedCount, 0) 
FROM 
(
    SELECT MONTH(DATE_SUB('2013-11-01', INTERVAL 0 MONTH)) AS aMonth 
    UNION SELECT MONTH(DATE_SUB('2013-11-01', INTERVAL 1 MONTH)) 
    UNION SELECT MONTH(DATE_SUB('2013-11-01', INTERVAL 2 MONTH)) 
    UNION SELECT MONTH(DATE_SUB('2013-11-01', INTERVAL 3 MONTH)) 
    UNION SELECT MONTH(DATE_SUB('2013-11-01', INTERVAL 4 MONTH)) 
    UNION SELECT MONTH(DATE_SUB('2013-11-01', INTERVAL 5 MONTH)) 
    UNION SELECT MONTH(DATE_SUB('2013-11-01', INTERVAL 6 MONTH)) 
) Sub1 
LEFT OUTER JOIN history 
ON MONTH(history.date) = Sub1.aMonth 
AND username LIKE '%@red%' 
LEFT OUTER JOIN 
(
    SELECT MONTH(date) AS aMonth, COUNT(DISTINCT username) AS SuccessCount 
    FROM history 
    WHERE status='success' 
    AND username LIKE '%@red%' 
    GROUP BY MONTH(date) 
) Sub2 
ON Sub1.aMonth = Sub2.aMonth 
LEFT OUTER JOIN 
(
    SELECT MONTH(date) AS aMonth, COUNT(DISTINCT username) AS FailedCount 
    FROM history 
    WHERE status='failed' 
    AND username LIKE '%@red%' 
    GROUP BY MONTH(date) 
) Sub3 
ON Sub1.aMonth = Sub3.aMonth 
GROUP BY Sub1.aMonth, SuccessCount, FailedCount