使用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:请看上面我修改过的答案中的备选方案。是否不可能用这一张表来完成它?---不,不可能。不过,你可以把整个过程都放在一个程序中。但是每次为这种查询创建临时表都会降低性能。这就是为什么有这样一张永久性的桌子更好的原因。难道不可能有一张桌子吗?不,那是不可能的。不过,你可以把整个过程都放在一个程序中。但是每次为这种查询创建临时表都会降低性能。这就是为什么有这样一张永久的桌子更好的原因