![](/img/trans.png)
[英]MySQL avg count per month for current year (include months with no data)
[英]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.