美文网首页mysql/oracle数据库
mysql查询一年 /七天的订单信息

mysql查询一年 /七天的订单信息

作者: 程序员ken | 来源:发表于2019-11-13 11:29 被阅读0次

一.查询一年12个月的订单数量,ps DUAL是虚拟表

SELECT a.count as count, b.time2 FROM (

SELECT count(*) AS count,

FROM_UNIXTIME( UNIX_TIMESTAMP(c.in_date), '%m' ) AS mon FROM ti_supplyorder c

                 where

                 <if test="order_state!=null">

                     c.order_state = #{order_state} AND

                 </if>

                 FROM_UNIXTIME( UNIX_TIMESTAMP(c.in_date), '%Y' ) = #{year}

                  GROUP BY mon

             ) a

 RIGHT JOIN (

                 SELECT '01' AS time2 FROM DUAL UNION ALL

                 SELECT '02' AS time2 FROM DUAL UNION ALL

                 SELECT '03' AS time2 FROM DUAL UNION ALL

                 SELECT '04' AS time2 FROM DUAL UNION ALL

                 SELECT '05' AS time2 FROM DUAL UNION ALL

                 SELECT '06' AS time2 FROM DUAL UNION ALL

                 SELECT '07' AS time2 FROM DUAL UNION ALL

                 SELECT '08' AS time2 FROM DUAL UNION ALL

                 SELECT '09' AS time2 FROM DUAL UNION ALL

                 SELECT '10' AS time2 FROM DUAL UNION ALL

                 SELECT '11' AS time2 FROM DUAL UNION ALL

                 SELECT '12' AS time2 FROM DUAL

        ) b ON a.mon = b.time2 order by b.time2

二、查询七天内的订单数量和金额  (如果是两年?)

例子一、

MySql查询时日期补全(连续)的一种方法

某一日,需要查询订单表中前7天每天的订单数,sql依次写出来:

SELECT

DATE_FORMAT(order_time,'%Y-%m-%d')date,

count(*) orderCount

FROM

orderWHERE

date_sub(curdate(),INTERVAL7DAY) <date(order_time)

GROUPBYDATE_FORMAT(order_time,'%Y-%m-%d')

ORDERBYdateASC

一执行,数据出来了,不过不连续,数量也没有7条,老板生意惨淡,很多时候一天不能来一个单,但程序不能没有数据,所以这里直观的办法就是补上差的数据,怎么补? 

第一想到的就是用上层语言来补,比如java:

//从数据库中查询指定天数之前到当前每天的订单数List<Map<String, Object>>orders=orderDao.queryOrder(7);

//补全数据库中不存在的日期,订单数为0List<String>dayList=DateUtil.dayList(7,1,false);//得到7天前到今天每天的日期

boolean exists=false;

for (int i=0;i<dayList.size();i++) {

exists=false;

for (Map<String, Object>hs : orders) {

if(dayList.get(i).equals(hs.get("date"))) {

exists=true;

break;

}

}

if(!exists){

finalStringdate=dayList.get(i);

orders.add(i,newHashMap<String,Object>(){{

put("orderCount",0);

put("datat",date);

}});

}

}

returnorders;

ok了,没问题。 

转过头,老板说7天业绩看不出我店半年不开张开张吃半年的本质,要求要自定义开始结束时间来查,我说,好嘞您! 

不过上面那种方法就存在问题了,真要选2年的日期来查,那得循环多少次啊?于是开动脑筋,由这里得到启发: mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法,下面来写sql:

SELECT

od.date,

od.orderCount

FROM

(

SELECT

DATE_FORMAT(order_time,'%Y-%m-%d')date,

count(*) orderCount

FROM

order

WHERE

order_time>'开始时间'andorder_time<'结束时间'

GROUPBYDATE_FORMAT(order_time,'%Y-%m-%d')

UNION(SELECT0,'2017-03-01')

UNION(SELECT0,'2017-03-02')

UNION(SELECT0,'2017-03-03')

UNION(SELECT0,'2017-03-04')

UNION(SELECT0,'2017-03-05')

UNION(SELECT0,'2017-03-06')

UNION(SELECT0,'2017-03-07')

UNION(SELECT0,'2017-03-08')

-- 很多个UNION......

)ASod

GROUPBYod.dateORDERBYod.dateASC

妥了!至于sql中间那一长串的UNION语句(红色部分),那就根据选择的日期用java生成吧! 

估计还有更好的方法,欢迎赐教!

例子2:

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

DATE_SUB() 函数从日期减去指定的时间间隔

select a.day,ifnull(b.count,0) as count,IFNULL(b.totalMoney,0) as totalMoney

     from (SELECT curdate() as day

        union all

     SELECT date_sub(curdate(), interval 1 day) as day

        union all

    SELECT date_sub(curdate(), interval 2 day) as day

       union all

    SELECT date_sub(curdate(), interval 3 day) as day

       union all

    SELECT date_sub(curdate(), interval 4 day) as day

       union all

    SELECT date_sub(curdate(), interval 5 day) as day

       union all

    SELECT date_sub(curdate(), interval 6 day) as day

     ) a left join (

     select date(add_time) as datetime, count(cust_id) as count,IFNULL(SUM(all_total_amount),0) as totalMoney

       from ti_orderinfo

     group by date(add_time)

     ) b on a.day = b.datetime

     ORDER BY a.`day`

来自印象笔记---2018-01-30

相关文章

  • mysql查询一年 /七天的订单信息

    一.查询一年12个月的订单数量,psDUAL是虚拟表 SELECT a.count as count, b.tim...

  • MyBatis一对多查询及延迟加载

    一对一查询 需求 查询所有订单信息,关联查询下单用户信息。 SQL 主信息:订单信息从信息:用户信息 方法 方法一...

  • 「Mybatis系列」Mybatis高级应用

    1. 关联查询 举例:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发,关联查询用户信息为一对一查询。...

  • MyBatis8-延迟加载

    什么是延迟加载 举个例子:如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息...

  • 高级映射-一对多查询

    1.需求查询订单及订单明细的信息。 2.思路使用resultType将上边的 查询结果映射到pojo中,订单信息的...

  • SQL server 普通查询

    创建客户信息表 创建客户订单表 0、查询客户信息select * from tblorder; 1、查询所有订单信...

  • MyBatis学习:MyBatis中的延迟加载

    MyBatis中的延迟加载。 1. 什么是延迟加载 例子:如果查询订单并且关联查询用户信息。如果先查询订单信息...

  • MongoDB联表查询

    创建表user、order 查询 联表查询 拆分orders 分组求和并返回字段数据 查询用户的订单信息(订单id...

  • mybatis高级映射一对多查询实现

    1.需求分析: 在开发中会遇到这样一个问题,查询订单信息,级联查询出用户信息和订单明细信息 2.sql语句实现 2...

  • 订单成功页面

    前端,src/views/OrderSuccess.vue 后端,根据订单Id去查询订单信息接口

网友评论

    本文标题:mysql查询一年 /七天的订单信息

    本文链接:https://www.haomeiwen.com/subject/undhictx.html