oracle查询最近7天数据没有展示0

假设现在有两张表order和user

order表

order_no订单号create_time创建时间price价格
GC1232017-3-171600
GC1242017-3-22120
GC1252017-3-22100

user表

user_idorder_no
1GC123
1GC124
1GC125

现在需要统计用户“1”在最近7天中每天的订单金额以及数量,如果哪天没有的话,展示0,既是展示下图结果(假设今天是23号)

createTimepricecount
2017-03-1716001
2017-03-1800
2017-03-1900
2017-03-2000
2017-03-2100
2017-03-222202
2017-03-2300

像这种比较复杂一点的sql,一下子写出完整的sql显然不太好写,需要一点点分析。首先,查询最近7天用户“1”的订单数据,这就话可以分成“最近7天”和“用户1的订单数据”。


sql查询最近7天数据(以年-月-日结果展示)

SELECT 
    to_char (SYSDATE- LEVEL + 1, 'yyyy-mm-dd') today 
  FROM
    DUAL connect BY LEVEL <= 7

查询结果
这里写图片描述


查询用户“1”的订单数据

SELECT 
  to_char(o.create_time, 'yyyy-mm-dd') createTime,
  nvl(SUM(o.price), 0) price,
  nvl(COUNT(1), 0) count 
FROM
  orders o,users u 
WHERE u.order_no = o.order_no 
  AND u.user_id = '1' 
GROUP BY to_char (o.create_time, 'yyyy-mm-dd')

查询结果

这里写图片描述

这句sql需要注意一下group by的使用,group by是结合聚合函数sum(和)、max(最大)、min(最小)、count(数量)、avg(平均)等使用的,然后select查询的字段必须包含在group by后或者聚合函数中作为分组依据,如果没有,sql就会报错。就比如以上sql中to_char(o.create_time, 'yyyy-mm-dd') 就必须出现在group by后作为分组依据,而聚合函数列则不需要


现在就是需要把两个sql关联起来即可,连接两个sql语句有left join、 inner join和right join,使用哪个才可以完成需要的查询呢?这里需要理解三者的却别
left join(左连接) 返回左表中所有记录和右表中连接字段相等的记录
right join(右连接) 和左连接相反
inner join(等值相连、内连接) 只返回两个表中连接字段相等的记录

现在就可以来连接两个sql语句了,以查询“最近7天”为“左表”,使用left join,可以这样写

SELECT 
  days.createTime createTime ,
  nvl (m.price, 0) price,
  nvl (m.COUNT, 0) count 
FROM
  (SELECT 
    to_char (SYSDATE- LEVEL + 1, 'yyyy-mm-dd') createTime  
  FROM
    DUAL connect BY LEVEL <= 7) days 
  LEFT JOIN 
    (SELECT 
      to_char (o.create_time, 'yyyy-mm-dd') createTime,
      nvl (SUM(o.price), 0) price,
      nvl (COUNT(1), 0) count 
    FROM
      orders o,users u 
    WHERE u.order_no = o.order_no 
      AND u.user_id = '1' 
    GROUP BY to_char (o.create_time, 'yyyy-mm-dd')) m 
    ON days.createTime  = m.createTime 
GROUP BY days.createTime ,m.price, m.count  
ORDER BY days.createTime   

查询结果

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值