使用if-else或case..的MySQL查询输出。。?
我有一张桌子使用if-else或case..的MySQL查询输出。。?,mysql,Mysql,我有一张桌子 mysql> select * FROM testa; +---------+-------+ | month_x | money | +---------+-------+ | 11101 | 12345 | | 11105 | 100 | | 11105 | 100 | | 11105 | 100 | | 11105 | 100 | | 11106 | 12345 | +---------+-------+ 6 rows in se
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)
其中,月份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。可以使用If语句-yes。 看看这个:
您可以使用IF语句-yes。 看看这个: 您可以使用来获取尾随的两位数字(当数字除以100时,它们是余数),然后假设您希望在数据“按月份分组”时求和
钱
:
或者,您可以使用Relay on MySQL并使用其字符串函数:
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;
但是我要指出的是,通常在数据库中不会这样做,因为它实际上属于表示层:从访问数据库的任何语言,如果结果集中没有相应的记录,您可以循环使用1…12
,并假设TOTAL
为0
。您可以使用来获得尾随的两位数字(当数字除以100时,它们是余数),然后假设您希望在数据“按月份分组”时求和money
:
或者,您可以使用Relay on MySQL并使用其字符串函数:
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;
但是我要指出的是,通常在数据库中不会这样做,因为它实际上属于表示层:从访问数据库的任何语言,如果结果集中没有相应的记录,您可以循环使用
1…12
,并假设TOTAL
为0
。为此,您需要首先创建一个包含月份数值的表
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 |
+------+-------+
为此,您需要首先创建一个包含月份数值的表
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 |
+------+-------+
这没关系。但是我想,如果月份不在我的实际表格中,那么01,05,06是存在的,但是一年中有12个月,所以如果这不在基础表格中,那么它应该在输出中,总和为0。正如我给出的示例输出pattern@AbdulManaf这只能通过使用临时表来完成。请看我的答案。@AbdulManaf:请看我上面修改过的答案中的备选方案。这是可以的。但是我想知道,如果月份没有出现在我的实际表格中,那么01,05,06是存在的,但是一年中有十二个月,所以如果这不在基础表格中,那么它应该以0的总和出现在输出中。正如我给出的示例输出一样pattern@AbdulManaf这只能通过使用临时表。请看我的答案。@AbdulManaf:请看上面我修改过的答案中的备选方案。是否不可能用这一张表来完成它?---不,不可能。不过,你可以把整个过程都放在一个程序中。但是每次为这种查询创建临时表都会降低性能。这就是为什么有这样一张永久性的桌子更好的原因。难道不可能有一张桌子吗?不,那是不可能的。不过,你可以把整个过程都放在一个程序中。但是每次为这种查询创建临时表都会降低性能。这就是为什么有这样一张永久的桌子更好的原因