我有一张桌子
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
可以使用If else或case。
答案 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;
<强>更新强>
正如@ shiplu.mokadd.im所述,要显示每月(甚至那些没有数据的那些),您需要从临时表中获取数字1到12。但是,您可以使用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;
HOWEVER 我会注意到通常通常不会在数据库中执行此操作,因为它实际上属于表示层:来自您正在访问的任何语言数据库,如果结果集中没有相应的记录,您将循环遍历1...12
并假设TOTAL
为0
。
答案 1 :(得分: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);
然后执行此查询,
SELECT m.mon,
IF(Sum(t.money) IS NULL, 0, Sum(t.money)) AS `money`
FROM testa t
RIGHT OUTER JOIN months m
ON ( t.month_x%100 = m.mon )
GROUP BY m.mon;
结果是,
+------+-------+
| 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 |
+------+-------+
答案 2 :(得分:0)
您可以使用IF语句 - 是的。 看看这个: http://dev.mysql.com/doc/refman/5.5/en/if-statement.html