【问题标题】:How to show all months in year regardless if there is a data per month in MySQL无论MySQL中是否有每月数据,如何显示一年中的所有月份
【发布时间】:2017-03-07 20:00:15
【问题描述】:

我有一个表view_remit,每个月的第一天(E_FROM)到月底(E_TO)都有一个ID列表和它们各自的total_PBR

|  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    |

我在这里使用了另一个问题的代码MySQL monthly Sale of last 12 months including months with no Sale

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。 任何帮助表示赞赏。

【问题讨论】:

  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 CREATE 和 INSERT 语句(和/或 sqlfiddle),以便我们可以更容易复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • GROUP BY 中的“笔”是什么?它应该是“ID”吗?

标签: mysql date sum


【解决方案1】:

试试这个:

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() 函数

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多