最近按需求实现会员年报表,

假设现有会员表member、订单表i_order,

member表字段(id, member_name, xxxx),

i_order表字段(id,member_id,handle_time,money,order_status,xxxx);

思路如下:

分别查询12个月及全年各会员消费总额,得到13个表,再将这13个表与member表通过left join on一起按会员名分组查询,得到各会员每月及年消费金额。

如,第一个月,各会员消费总额表,

SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成'  AND MONTH(io.handle_time)='1' GROUP BY io.member_name) AS jan

第二个月,各会员消费总额表,

SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='2' GROUP BY io.member_name) AS Feb

第十二个月,各会员消费总额表,

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='12' GROUP BY io.member_name) AS Dece

一年中,各会员消费总额表,

SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' GROUP BY io.member_name ) AS oneYear

这13个表与member表一起join...on,按会员名分组,得到各会员每月及年消费总额,如下,

SELECT m.id,m.no,m.name,m.realname,

(case when jan.money is  NULL then 0 ELSE jan.money end) as janmoney,

(case when Feb.money is  NULL then 0 ELSE Feb.money end) AS febmoney,

(case when Mar.money is  NULL then 0 ELSE Mar.money end) AS marmoney,

(case when Apr.money is  NULL then 0 ELSE Apr.money end) AS aprmoney,

(case when May.money is  NULL then 0 ELSE May.money end) AS maymoney,

(case when Jun.money is  NULL then 0 ELSE Jun.money end) AS junmoney,

(case when Jul.money is  NULL then 0 ELSE Jul.money end) AS julmoney,

(case when Aug.money is  NULL then 0 ELSE Aug.money end) AS augmoney,

(case when Sep.money is  NULL then 0 ELSE Sep.money end) AS sepmoney,

(case when Oct.money is  NULL then 0 ELSE Oct.money end) AS octmoney,

(case when Nov.money is  NULL then 0 ELSE Nov.money end) AS novmoney,

(case when Dece.money is  NULL then 0 ELSE Dece.money end) AS decemoney,

(case when oneyear.money is  NULL then 0 ELSE oneyear.money end) AS yearmoney

from member AS m LEFT JOIN

(SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成'

AND MONTH(io.handle_time)='1' and YEAR(jan.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS jan

ON (jan.member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='2' and YEAR(Feb.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Feb

ON (Feb.member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='3' and YEAR(Mar.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Mar

ON (Mar.member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='4' and YEAR(Apr.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Apr

ON (Apr.member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='5' and YEAR(May .handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS May

ON (May .member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='6' and YEAR(Jun .handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Jun

ON (Jun .member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='7' and YEAR(Jul .handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Jul

ON (Jul .member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='8' and YEAR(Aug.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Aug

ON (Aug.member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='9' and YEAR(Sep.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Sep

ON (Sep.member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='10' and YEAR(Oct.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Oct

ON (Oct.member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='11' and YEAR(Nov.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Nov

ON (Nov.member_id=m.id)

LEFT JOIN (SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' AND MONTH(io.handle_time)='12' and YEAR(Dece.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name) AS Dece

ON (Dece.member_id=m.id)

LEFT JOIN(SELECT io.member_id,io.member_name,SUM(io.money) money,io.handle_time

FROM i_order io where io.order_status='已完成' and YEAR(oneYear.handle_time)=YEAR(CURDATE()) GROUP BY io.member_name ) AS oneYear

ON (oneYear.member_id=m.id)

GROUP BY m.name

查询结果:

多试,多思考,得出结果。

mysql查每个月的收入_mysql 查询每个人、每个月的消费金额及每年的消费总额相关推荐

  1. mysql 查重名现象_mysql查询重复数据【转】

    表全部数据 ------------------- 1 查询people_no重复的记录 select * from people where people_no in (select people_ ...

  2. mysql查每天的销售额_Mysql查询最近30天的数据(每天的业绩总和数据)

    需求:查询最近30天每天的业绩总和(当天没有业绩的默认为0) 1.刚开始我的sql是这样写的: SELECT truncate(sum(af2.money),2) as m,DATE_FORMAT(a ...

  3. mysql 查所有的用户_MySQL查看所有用户 - MySQL 系列教程

    在使用 MySQL 或其它关系型数据库的时候,免不了需要查看所有用户的信息,比如这些用户分别有什么权限,何时创建的之类.这篇文章里我们讨论,如何在 MySQL 中查看所有用户的信息. SHOW DAT ...

  4. mysql 时差查了13小时_MySQL查询检查如何获取时差

    让我们首先创建一个表-mysql> create table DemoTable1570 -> ( -> ArrivalTime datetime -> ); 使用插入命令在表 ...

  5. mysql查binlog删除时间_mysql的binlog日志删除查询

    最近发现mysql的binlog日志一直在被删除中...导致从机出错后没法排查问题. 查阅资料后,发现配置文件的expire_logs_days的参数是保存binlog日志的时间参数.mysql> ...

  6. mysql选出重复的字段_mysql查询表里的重复数据方法:

    INSERT INTO hk_test(username, passwd) VALUES ('qmf1', 'qmf1'),('qmf2', 'qmf11') delete from hk_test  ...

  7. mysql 下一条数据_mysql 查询一条记录的下一条和上一条记录

    如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from tab ...

  8. mysql可以存储标点么_MySQL查询(进阶)(每个标点都是重点)

    MySQL 是工作中很普遍的需要用到的,所以必须掌握,而 之前我们一直说的都是怎么存. 你只会存不会取有个屁用.所以希望大家在如何查询读取数据这方面多下点功夫. 这篇和上一篇都是干货,我也是第一次学. ...

  9. mysql dump 到的文件_mysql查询结果导出到文件

    方法一: 直接执行命令: mysql> select count(1) from table into outfile '/tmp/test.xls'; Query OK, 31 rows af ...

最新文章

  1. 2013年网络安全事件盘点
  2. BHMS的完整形式是什么?
  3. final关键字/abstract关键字
  4. zabbix历史数据mysql_处理Zabbixl历史数据库解决办法三---使用MySQL中间件为Zabbix数据库扩容...
  5. 【证明】—— 二叉树的相关证明
  6. 在VC下实现串口通讯
  7. 数值分析(2)-误差
  8. wmp 11安装方法
  9. Boost.auto_ptr的实现源码
  10. SpringBoot(一)——入门
  11. 15款js编辑器大全 收藏
  12. 面试进行曲之技术面试(项目经验)
  13. 程序员10大境界【走在路上,潜心修行】
  14. 使用计算机需要准备硬件和什么,当个人计算机需要使用ADSL访问Internet时,所需的基本硬件设施是什么?...
  15. Android Watchdog框架解析、应用与改造(上)
  16. oracle变成大写快捷键,Oracle函数(把每个单词首个字母变为大写)
  17. 几个可以免费下载或阅读电子书的网站
  18. PLC编程软件在线调试程序的方法
  19. ecmall php传变量,PHP_ECMall支持SSL连接邮件服务器的配置方法详解,首先,主要是ecmall使用的phpmail - phpStudy...
  20. 动态大奖赛和CRM解决方案时间表说明

热门文章

  1. Oracle:2、SQL基础
  2. yl335b分拣站单元流程图_基于PLC与MCGS的YL-335B分拣单元的创新设计
  3. 苹果怎么设置铃声?设置自己喜欢的歌曲作为铃声,一招搞定!
  4. 服务器硬盘数据备份到nas,如何使用 Time Machine 将文件从 Mac 备份至 Synology NAS
  5. java 关系运算符-逻辑运算符概述-逻辑运算符
  6. python安装虚拟环境没有activate_python安装虚拟环境
  7. Getting started with wxPython
  8. arctanx麦克劳林公式推导过程_点到线的距离公式推导过程
  9. 2-github术语介绍
  10. 发疯之后创业能更成功吗?leo看赢在中国第三季(5)