2012-05-02 60 views
0

我有一個表作爲MySQL查詢輸出使用if else或case ..?

mysql> select * FROM testa; 
+---------+-------+ 
| month_x | money | 
+---------+-------+ 
| 11101 | 12345 | 
| 11105 | 100 | 
| 11105 | 100 | 
| 11105 | 100 | 
| 11105 | 100 | 
| 11106 | 12345 | 
+---------+-------+ 
6 rows in set (0.00 sec) 

其中在month_x最後兩位數字是幾個月了,我想我作爲

Month TOTAL 
01 12345 
02 0 
03 0 
04 0 
05 400 
06 12345 
07 0 
08 0 
09 0 
10 0 
11 0 
12 0 

或其他情況下使用,如果可能的輸出。

回答

1

爲此,您需要首先創建一個包含月份數值的表格。

CREATE TABLE `months` (
    `mon` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
INSERT INTO `months` VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12); 

然後執行此查詢,

結果是,

+------+-------+ 
| mon | money | 
+------+-------+ 
| 1 | 12345 | 
| 2 |  0 | 
| 3 |  0 | 
| 4 |  0 | 
| 5 | 400 | 
| 6 | 12345 | 
| 7 |  0 | 
| 8 |  0 | 
| 9 |  0 | 
| 10 |  0 | 
| 11 |  0 | 
| 12 |  0 | 
+------+-------+ 
+0

這是不可能與單一表.. ..? –

+0

不,這是不可能的。然而,你可以把整個事情放在一個程序中。但是每次爲這樣的查詢創建臨時表都會降低性能。這就是爲什麼擁有這種永久性桌子更好 –

2

您可以使用modular arithmetic獲得後兩位數字(他們的當數除以100的餘數),那麼假設你想總結money當你的數據是「按分組「一個月:

SELECT month_x % 100 AS Month, SUM(money) AS TOTAL 
FROM testa 
GROUP BY Month 
ORDER BY Month ASC; 

或者,你可以使用依賴於MySQL的implicit type conversion,並使用其字符串函數:

SELECT RIGHT(month_x, 2) AS Month, SUM(money) AS TOTAL 
FROM testa 
GROUP BY Month 
ORDER BY Month ASC; 

UPDATE

正如@ shiplu.mokadd.im狀態,每個月(甚至那些您有沒有數據),則需要從臨時表到12獲得數字1表示。但是,您可以使用UNION在查詢中創建一個這樣的臨時表:

 SELECT 1 
UNION SELECT 2 
UNION SELECT 3 -- etc 

因此:

SELECT Month, Sum(money) AS TOTAL 
FROM testa 
    RIGHT JOIN (
     SELECT 1 AS Month 
    UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 
    UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 
    UNION SELECT 12 
) months ON testa.month_x % 100 = months.Month 
GROUP BY Month; 

無論其我想指出,通常一個通常不會在這樣做數據庫,因爲它確實屬於表示層:無論您正在訪問數據庫的任何語言,如果在r中沒有對應的記錄,您將循環使用1...12並假定TOTAL0 esultset。

+0

這是ok.but我想,如果一個月不存在在我的實際表中的01,05 ,06是存在的,但是有一年的時間是12個月,所以如果這不是在基礎表中,它應該在總和爲0的輸出中。因爲我給出了樣本輸出模式 –

+0

@AbdulManaf它只能通過使用臨時表。看到我的答案。 –

+0

@AbdulManaf:請參閱上面我修改後的答案。 – eggyal