思路:创建视图,查询过去的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中的日期间隔类型如下表所示:
二、利用存储过程的方式实现(后续补充)