之前计算用户ID各月的金额(各月在列字段),用的是下面代码

 SELECT b.城市,SUM(IF(b.年月=201607,b.金额,NULL)) AS 7月金额,SUM(IF(b.年月=201608,b.金额,NULL)) AS 8月金额,SUM(IF(b.年月=201609,b.金额,NULL)) AS 9月金额
FROM (
SELECT city AS 城市,DATE_FORMAT(order_time,"%Y%m") AS 年月,SUM(pay_money) AS 金额
FROM test_a03order AS a
GROUP BY city,DATE_FORMAT(order_time,"%Y%m")
) AS b
GROUP BY b.城市

a.日常报表中一般下个月月初做上个月报表,随着时间推移文件越来越大,很多历史数据或许也没有多少价值,如果我们想生成固定的保留几个月的数据,比如总是保持最近6个月的数据,如何实现?原来如果计划保持最近6个月的 出报表的时候 就需要手动修改sum(if())的代码  把下个月的添加进来 把第一个月的去掉(现在是7,8,9月,下个月换为8,9,10,把10月加进来,7月删除 这样保持最近3个月) 有点麻烦

b.如果自动保持最近6个月的数据 大致思路是判断数据源的数据月份与当前月的间隔始终保持在1-6之间,添加这样的判断字段可以有多个方式,这里有两个 实质上是一个原理。

第一种实现办法是添加一个字段和当前年月间隔,用case when 进行判断处理

1.添加 月最后一天 和 与当前月间隔几月 字段

 SELECT a1.city AS 城市,a1.username AS 用户ID,DATE_FORMAT(a1.order_date,"%Y%m") AS 年月,SUM(a1.pay_money) AS 金额,LAST_DAY(a1.order_date) AS 月最后一天,
CASE
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 7 MONTH),"%Y%m") THEN "6"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 6 MONTH),"%Y%m") THEN "5"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 5 MONTH),"%Y%m") THEN "4"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 4 MONTH),"%Y%m") THEN "3"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 3 MONTH),"%Y%m") THEN "2"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 2 MONTH),"%Y%m") THEN "1"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 1 MONTH),"%Y%m") THEN "0"
ELSE NULL END 与当前月间隔几月
FROM `test_a03order` AS a1
GROUP BY a1.city ,a1.username,DATE_FORMAT(a1.order_date,"%Y%m")

2、sum((if))函数行转列 通过控制与当前月间隔几月等于几 保留最近几个月的数据 这样就不用手动修改了 下个月保留的是最近6个月的数据

 SELECT a.城市,
SUM(IF(与当前月间隔几月=6,金额,NULL)) AS "前6月",SUM(IF(与当前月间隔几月=5,金额,NULL)) AS "前5月",
SUM(IF(与当前月间隔几月=4,金额,NULL)) AS "前4月",SUM(IF(与当前月间隔几月=3,金额,NULL)) AS "前3月",
SUM(IF(与当前月间隔几月=2,金额,NULL)) AS "前2月",SUM(IF(与当前月间隔几月=1,金额,NULL)) AS "前1月"
FROM (
SELECT a1.city AS 城市,a1.username AS 用户ID,DATE_FORMAT(a1.order_date,"%Y%m") AS 年月,SUM(a1.pay_money) AS 金额,LAST_DAY(a1.order_date) AS 月最后一天,
CASE
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 7 MONTH),"%Y%m") THEN "6"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 6 MONTH),"%Y%m") THEN "5"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 5 MONTH),"%Y%m") THEN "4"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 4 MONTH),"%Y%m") THEN "3"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 3 MONTH),"%Y%m") THEN "2"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 2 MONTH),"%Y%m") THEN "1"
WHEN DATE_FORMAT(LAST_DAY(a1.order_date),"%Y%m")=DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE),INTERVAL 1 DAY),INTERVAL - 1 MONTH),"%Y%m") THEN "0"
ELSE NULL END 与当前月间隔几月
FROM `test_a03order` AS a1
GROUP BY a1.city ,a1.username,DATE_FORMAT(a1.order_date,"%Y%m")
) AS a
GROUP BY a.城市
ORDER BY a.城市

第二种办法是只添加月最后一天字段 是通过判断和当前日期所在月和子表里月最后一天所处的年月的月间隔 进行数据源时间的截取 以及sum(if())函数的行转列 实现最终目的

#当前月和子表里月最后一天所处的年月的月间隔为6 就是前6月数据

PERIOD_DIFF(DATE_FORMAT(CURRENT_DATE,"%Y%m"),DATE_FORMAT(月最后一天,"%Y%m"))=6

这个函数是判断月间隔 不考虑月天数

 SELECT a.城市,
SUM(IF(PERIOD_DIFF(DATE_FORMAT(CURRENT_DATE,"%Y%m"),DATE_FORMAT(月最后一天,"%Y%m"))=6,金额,NULL)) AS "前6月",SUM(IF(PERIOD_DIFF(DATE_FORMAT(CURRENT_DATE,"%Y%m"),DATE_FORMAT(月最后一天,"%Y%m"))=5,金额,NULL)) AS "前5月",
SUM(IF(PERIOD_DIFF(DATE_FORMAT(CURRENT_DATE,"%Y%m"),DATE_FORMAT(月最后一天,"%Y%m"))=4,金额,NULL)) AS "前4月",SUM(IF(PERIOD_DIFF(DATE_FORMAT(CURRENT_DATE,"%Y%m"),DATE_FORMAT(月最后一天,"%Y%m"))=3,金额,NULL)) AS "前3月",
SUM(IF(PERIOD_DIFF(DATE_FORMAT(CURRENT_DATE,"%Y%m"),DATE_FORMAT(月最后一天,"%Y%m"))=2,金额,NULL)) AS "前2月",SUM(IF(PERIOD_DIFF(DATE_FORMAT(CURRENT_DATE,"%Y%m"),DATE_FORMAT(月最后一天,"%Y%m"))=1,金额,NULL)) AS "前1月"
FROM (
SELECT a1.city AS 城市,a1.username AS 用户ID,DATE_FORMAT(a1.order_date,"%Y%m") AS 年月,SUM(a1.pay_money) AS 金额,LAST_DAY(a1.order_date) AS 月最后一天
FROM `test_a03order` AS a1
GROUP BY a1.city ,a1.username,DATE_FORMAT(a1.order_date,"%Y%m")
) AS a
GROUP BY a.城市
ORDER BY a.城市

因此推荐使用第二种办法代码短  第一种办法细致点容易理解 是对第二种的拆解

3、在excel里设置模板 把前6月字样用函数替换掉

excel里函数 设置表头 TEXT(DATE(YEAR(NOW()),MONTH(NOW())-6,1),"yyyymm")

Kettle步骤里 Microsoft Excel 输出的时候选择不输出表头就可以自动更新了

kettle结合MySQL生成保留最近6个月月度报告_20161009的更多相关文章

  1. MySQL 仅保留7天、一个月数据

    /************************************************************************** * MySQL 仅保留7天.一个月数据 * 说明 ...

  2. highcharts实例教程二:结合php与mysql生成饼图

    上回我们分析了用highcharts结合php和mysql生成折线图的实例,这次我们以技术cto网站搜索引擎流量为例利用highcharts生成饼图. 饼图通常用在我们需要直观地显示各个部分所占的比例 ...

  3. kettle连接mysql

    kettle连接mysql时出现问题

  4. 利用TPC-H为MYSQL生成数据

    ## 利用TPC-H为MYSQL生成数据 导言 这篇文章是看了joyee写的TPC-H数据导入MySQL教程以及另一篇网上的MySQL TPCH测试工具简要手册 后写的,有些内容是完全转载自以上两篇文 ...

  5. [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子:

    [Spark][Python]Spark 访问 mysql , 生成 dataframe 的例子: mydf001=sqlContext.read.format("jdbc").o ...

  6. mysql 生成UUID() 即 ORACLE 中的guid()函数

    MYSQL 生成UUID 即 guid 函数-- 带 - 的UUIDselect UUID() -- 去掉 - 的UUIDselect replace(uuid(),'-','') 一个表的数据插入另 ...

  7. VS2017+EF+Mysql生成实体数据模型(解决闪退的坑)

    原文:VS2017+EF+Mysql生成实体数据模型(解决闪退的坑) 最近要使用VS2017+EF+Mysql,在生成实体数据模型踏过一些坑,在此做个总结. 1.先下载并安装 mysql-connec ...

  8. Mysql 生成不重复的随机数字

    在网上查找Mysql 生成不重复的随机数字 ,竟然没找到合适的例子. 其实思路很简单,利用MySQL现有的函数,然后进行加工处理,达到预期的结果.可以用到的MySQL函数为rand() ,以及 rou ...

  9. JMeter:生成漂亮的多维度的HTML报告

    JMeter:生成漂亮的多维度的HTML报告我们做性能测试的时候会经常使用一些性能测试工具,我个人比较喜欢Jmeter这个工具,但是JMeter这个工具在生成测试报告方面一直有所欠缺.但是JMeter ...

随机推荐

  1. PowerDesigner将PDM导出生成WORD文档(转)

    今天的温习老知识,是如何将一个PD设计的PDM来导出WORD文档,这是一个非常实用的功能,可以在软件过程的数据库设计文档编写中节省N多时间, 那不废话了,我们就开始今天的讲解吧! 第一步,点击Repo ...

  2. Java设计模式(九)责任链模式 命令模式

    (十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化.这种设计能够使得系统更加 ...

  3. iphone开发之获取网卡的MAC地址和IP地址

    本文转载至 http://blog.csdn.net/arthurchenjs/article/details/6358489 这是获取网卡的硬件地址的代码,如果无法编译通过,记得把下面的这几个头文件 ...

  4. Hihocoder #1602 : 本质不同的回文子串的数量 manacher + BKDRhash

    #1602 : 本质不同的回文子串的数量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个字符串S,请统计S的所有子串中,有多少个本质不同的回文字符串? 注意如果 ...

  5. 我的Android进阶之旅------>Android如何通过自定义SeekBar来实现视频播放进度条

    首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb,在Thumb正上方有一个PopupWindow窗口,窗口里面显示当前的播放时间.在Seek ...

  6. abap 打开文件对话框

    [转自 http://blog.csdn.net/zhongguomao/article/details/6712576] *----------------------- Method 1 ---- ...

  7. git显示颜色配置

    启用默认的颜色设置可以使用如下命令 git config --global color.ui true 如果不喜欢花花绿绿的颜色,可以将其关闭: git config --global color.u ...

  8. 素数筛总结篇___Eratosthenes筛法和欧拉筛法(*【模板】使用 )

    求素数 题目描述 求小于n的所有素数的数量. 输入 多组输入,输入整数n(n<1000000),以0结束. 输出 输出n以内所有素数的个数. 示例输入 10 0 示例输出 4 提示 以这道题目为 ...

  9. ASP.NET 4.0 页面 ValidateRequest="false" 失效不起作用

    当ASP.NET 2.0升级到 ASP.NET 4.0后,页面的 ValidateRequest="false" 不起作用. 因为 ASP.NET 4.0 请求验证被提前到IHtt ...

  10. python类初探

    class human: is_alive=True is_man=True def __init__(self,age): print('this is __init__() method, whi ...