记录mysql查询过去十二个月中每个月的数据情况(含本月)

思路:创建视图,查询过去的12个月;当然,也可以使用存储过程遍历的把12个月插入到一个临时表中。

一、以视图的形式实现

1.1创建过去十二个月的视图SQL

 可直接copy执行

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`%` 
    SQL SECURITY DEFINER
VIEW `year_month_view` AS
    SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 1 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 2 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 3 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 4 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 5 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 6 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 7 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 8 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 9 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 10 MONTH), '%Y-%m') AS `year_month` 
    UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 11 MONTH), '%Y-%m') AS `year_month`

关于sql中用到的视图语法说明及视图说明链接:

a、ALGORITHM可取三个值:MERGE、TEMPTABLE或UNDEFINED。

如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。算法会影响MySQL处理视图的方式。

对于MERGE,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。

对于TEMPTABLE,视图的结果将被置于临时表中,然后使用它执行语句。

对于UNDEFINED,MySQL自己选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,

这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。

b、DEFINER 表示按定义者拥有的权限来执行(指定视图创建者)

      INVOKER 表示用调用者的权限来执行。默认情况下,系统指定为DEFINER 

c、SQL SECURITY DEFINER:指定视图查询数据时的安全验证方式;

语法一

DATE_FORMAT(date,format)
date 参数是合法的日期。format 规定日期/时间的输出格式。

语法二

CURDATE()函数返回当前的日期。

INTERVAL 

详情链接:

效果如图:创建完成查看视图sql

select ym.year_month from year_month_view ym group by ym.year_month;

1.2 关联查询数据sql

SELECT
	ymv.year_month yearMonth,
	ifnull(pi.totalPay, 0) totalPay
FROM
	year_month_view ymv
LEFT JOIN (
	SELECT
		DATE_FORMAT(pi.in_Issu_time, '%Y-%m') yearMonth,
		SUM(pi.total_Tax_included_Am) totalPay
	FROM
		pj_invoice pi
	WHERE
		DATE_FORMAT(pi.in_Issu_time, '%Y-%m') > DATE_FORMAT(
			date_sub(curdate(), INTERVAL 12 MONTH),
			'%Y-%m'
		)
	GROUP BY
		yearMonth
) pi ON ymv.year_month = pi.yearMonth
GROUP BY
	ymv.year_month

说明:sql对应in_Issu_time是我业务表中对应的某个时间,具体业务是查询过去一年中每个月的数据的总额。

pj对应的要查询的数据业务表、year_month_view视图、total_Tax_included_Am每条记录的总额度、计算出的总额totalPay

DATE_SUB(d,INTERVAL expr type)函数返回起始日期d减去一个时间段后的日期。

expr是一个表达式,用来指定从起始日期添加或减去的时间间隔值。

expr是一个字符串。对于负值的时间间隔,它可以用一个负号“-”开头。

expr表达式与后面的间隔类型type对应。

MySQL中的日期间隔类型如下表所示:

二、利用存储过程的方式实现(后续补充)

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值