繁体   English   中英

如何显示一年中的所有月份,而无论MySQL中每月是否有数据

[英]How to show all months in year regardless if there is a data per month in MySQL

我有一个表view_remit ,其中包含ID及其各自的total_PBR的列表,每个月的第一天(E_FROM)到月底(E_TO)。

|  ID  |  E_From  |   E_To   |Total_PBR|
|  01  |01/01/2016|03/31/2016|  1000   |
|  01  |08/01/2016|08/31/2016|  1000   |
|  02  |01/01/2016|01/31/2016|  3000   |
|  02  |02/01/2016|02/29/2016|  3000   |

我想要的是选择所有月份,每个ID有付款和无付款。 像下面的例子。

|  ID  |  E_From  |   E_To   |Total_PBR|
|  01  |01/01/2016|01/31/2016|  1000   |
|  01  |02/01/2016|02/29/2016|  1000   |
|  01  |03/01/2016|03/31/2016|  1000   |
|  01  |04/01/2016|04/30/2016|    0    |
|  01  |05/01/2016|05/31/2016|    0    |
|  01  |06/01/2016|06/30/2016|    0    |
|  01  |07/01/2016|07/31/2016|    0    |
|  01  |08/01/2016|08/31/2016|  1000   |
|  01  |09/01/2016|09/30/2016|    0    |
|  01  |10/01/2016|10/31/2016|    0    |
|  01  |11/01/2016|11/30/2016|    0    |
|  01  |12/01/2016|12/31/2016|    0    |

我从这里的另一个问题中使用了此代码,过去12个月的MySQL月度销售,包括无销售月

SELECT ID, 
IF( MONTH( E_From ) =  1, Total_PBR, 0 ) AS  'Jan', 
IF( MONTH( E_From ) =  2, Total_PBR, 0 ) AS  'Feb', 
IF( MONTH( E_From ) =  3, Total_PBR, 0 ) AS  'Mar', 
IF( MONTH( E_From ) =  4, Total_PBR, 0 ) AS  'Apr', 
IF( MONTH( E_From ) =  5, Total_PBR, 0 ) AS  'May', 
IF( MONTH( E_From ) =  6, Total_PBR, 0 ) AS  'Jun', 
IF( MONTH( E_From ) =  7, Total_PBR, 0 ) AS  'Jul', 
IF( MONTH( E_From ) =  8, Total_PBR, 0 ) AS  'Aug', 
IF( MONTH( E_From ) =  9, Total_PBR, 0 ) AS  'Sep', 
IF( MONTH( E_From ) =  10, Total_PBR, 0 ) AS 'Oct', 
IF( MONTH( E_From ) =  11, Total_PBR, 0 ) AS 'Nov', 
IF( MONTH( E_From ) =  12, Total_PBR, 0 ) AS 'Dec', year(E_FROM) AS Year,
SUM(Total_PBR ) AS total_yearly
FROM view_remit
GROUP BY PEN, YEAR( E_From )
LIMIT 0 , 30

它有效,但是不能正确计算出几个月的total_PBR。 任何帮助表示赞赏。

试试这个:

SELECT ID, 
SUM(IF( MONTH( E_From ) =  1, Total_PBR, 0 )) AS  'Jan', 
SUM(IF( MONTH( E_From ) =  2, Total_PBR, 0 )) AS  'Feb', 
SUM(IF( MONTH( E_From ) =  3, Total_PBR, 0 )) AS  'Mar', 
SUM(IF( MONTH( E_From ) =  4, Total_PBR, 0 )) AS  'Apr', 
SUM(IF( MONTH( E_From ) =  5, Total_PBR, 0 )) AS  'May', 
SUM(IF( MONTH( E_From ) =  6, Total_PBR, 0 )) AS  'Jun', 
SUM(IF( MONTH( E_From ) =  7, Total_PBR, 0 )) AS  'Jul', 
SUM(IF( MONTH( E_From ) =  8, Total_PBR, 0 )) AS  'Aug', 
SUM(IF( MONTH( E_From ) =  9, Total_PBR, 0 )) AS  'Sep', 
SUM(IF( MONTH( E_From ) =  10, Total_PBR, 0 )) AS 'Oct', 
SUM(IF( MONTH( E_From ) =  11, Total_PBR, 0 )) AS 'Nov', 
SUM(IF( MONTH( E_From ) =  12, Total_PBR, 0 )) AS 'Dec', 
year(E_FROM) AS Year,
FROM view_remit
GROUP BY ID, YEAR( E_From )

如果每个月只有一个数据记录,请忽略SUM()函数

您可以参考此查询并根据需要对其进行修改。 我用以下数据创建了一个测试表:

select * from test;
+----+---------------------+--------+
| id | pay_date            | salary |
+----+---------------------+--------+
|  1 | 2015-01-01 00:00:00 |   5000 |
|  2 | 2015-02-01 00:00:00 |   6000 |
|  3 | 2015-05-01 00:00:00 |   5000 |
|  4 | 2015-09-01 00:00:00 |   8000 |
+----+---------------------+--------+

现在运行以下查询:

SELECT months.monthname, coalesce(payments.salary, 0) FROM
(
  SELECT 'January'   monthname, 1  month_num UNION 
  SELECT 'February'  monthname, 2  month_num UNION 
  SELECT 'March'     monthname, 3  month_num UNION 
  SELECT 'April'     monthname, 4  month_num UNION 
  SELECT 'May'       monthname, 5  month_num UNION 
  SELECT 'June'      monthname, 6  month_num UNION 
  SELECT 'July'      monthname, 7  month_num UNION 
  SELECT 'August'    monthname, 8  month_num UNION 
  SELECT 'September' monthname, 9  month_num UNION 
  SELECT 'October'   monthname, 10 month_num UNION
  SELECT 'November'  monthname, 11 month_num UNION 
  SELECT 'December'  monthname, 12 month_num
) months
LEFT JOIN(
  SELECT monthname (pay_date) monthname, salary FROM test
) payments
ON (months.monthname=payments.monthname)
ORDER BY months.month_num;

将显示以下结果:

+-----------+------+
| monthname | pay  |
+-----------+------+
| January   | 5000 |
| February  | 6000 |
| March     |    0 |
| April     |    0 |
| May       | 5000 |
| June      |    0 |
| July      |    0 |
| August    |    0 |
| September | 8000 |
| October   |    0 |
| November  |    0 |
| December  |    0 |
+-----------+------+
12 rows in set (0.00 sec)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM