慎終如始,則無敗事

道學無止境,誠然心地行,超然於物外,絕待不歸真。

  • 博客访问: 5509288
  • 博文数量: 589
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-19 21:50
个人简介

高山仰止http://my.csdn.net/wzy0623王工的博客 参加炼数成金培训输入 Dataguru培训优惠码 DR50,报名立减50%固定学费。 http://edu.dataguru.cn/

ITPUB论坛APP

ITPUB论坛APP



APP发帖 享双倍积分

文章分类

全部博文(589)

文章存档

2017年(61)

2016年(104)

2015年(144)

2014年(220)

2013年(60)

微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题
动态固定行转列 2017-08-31 18:44:35

分类: Oracle

需求要看最近7天新增评论数,而且每天都要查一次
SQL不复杂

  1.   SELECT to_char(createtime,'yyyy-mm-dd') createtime,count(*) c
  2.   FROM
  3.   mvbox_space.user_comment
  4.   where createtime>=trunc(sysdate - interval '7' day)
  5.   and createtime<trunc(sysdate)
  6.   group by to_char(createtime,'yyyy-mm-dd')
查询结果:

但是需求要横着看数据。
这块一般都是 固定行数 行转列 处理,但是每天的日期是变化的,行转列的值不能写死.

这样就得用数字辅助表过渡一下。

  1. select
  2. max(case when lv=1 then nvl(t2.c,0) else null end) || '' c,
  3. max(case when lv=2 then nvl(t2.c,0) else null end) || '' c,
  4. max(case when lv=3 then nvl(t2.c,0) else null end) || '' c,
  5. max(case when lv=4 then nvl(t2.c,0) else null end) || '' c,
  6. max(case when lv=5 then nvl(t2.c,0) else null end) || '' c,
  7. max(case when lv=6 then nvl(t2.c,0) else null end) || '' c,
  8. max(case when lv=7 then nvl(t2.c,0) else null end) || '' c
  9. from (
  10.   select to_char(trunc(sysdate)-numtodsinterval(level, 'day'),'yyyy-mm-dd') dt,level lv from dual connect by level <=7
  11. ) t1
  12. left join(
  13.   SELECT to_char(createtime,'yyyy-mm-dd') createtime,count(*) c
  14.   FROM
  15.   mvbox_space.user_comment
  16.   where createtime>=trunc(sysdate - interval '7' day)
  17.   and createtime<trunc(sysdate)
  18.   group by to_char(createtime,'yyyy-mm-dd')
  19. ) t2 on (t1.dt=t2.createtime);
查询结果:



但是这样导出的时候,没有带具体的日期信息。
看着又不直观了。
所以再稍作修改。

  1. select
  2. max(case when level=1 then to_char(trunc(sysdate)-numtodsinterval(level, 'day'),'yyyy-mm-dd') else null end) || '' c,
  3. max(case when level=2 then to_char(trunc(sysdate)-numtodsinterval(level, 'day'),'yyyy-mm-dd') else null end) || '' c,
  4. max(case when level=3 then to_char(trunc(sysdate)-numtodsinterval(level, 'day'),'yyyy-mm-dd') else null end) || '' c,
  5. max(case when level=4 then to_char(trunc(sysdate)-numtodsinterval(level, 'day'),'yyyy-mm-dd') else null end) || '' c,
  6. max(case when level=5 then to_char(trunc(sysdate)-numtodsinterval(level, 'day'),'yyyy-mm-dd') else null end) || '' c,
  7. max(case when level=6 then to_char(trunc(sysdate)-numtodsinterval(level, 'day'),'yyyy-mm-dd') else null end) || '' c,
  8. max(case when level=7 then to_char(trunc(sysdate)-numtodsinterval(level, 'day'),'yyyy-mm-dd') else null end) || '' c
  9. from dual connect by level <=7
  10. union all
  11. select
  12. max(case when lv=1 then nvl(t2.c,0) else null end) || '' c,
  13. max(case when lv=2 then nvl(t2.c,0) else null end) || '' c,
  14. max(case when lv=3 then nvl(t2.c,0) else null end) || '' c,
  15. max(case when lv=4 then nvl(t2.c,0) else null end) || '' c,
  16. max(case when lv=5 then nvl(t2.c,0) else null end) || '' c,
  17. max(case when lv=6 then nvl(t2.c,0) else null end) || '' c,
  18. max(case when lv=7 then nvl(t2.c,0) else null end) || '' c
  19. from (
  20.   select to_char(trunc(sysdate)-numtodsinterval(level, 'day'),'yyyy-mm-dd') dt,level lv from dual connect by level <=7
  21. ) t1
  22. left join(
  23.   SELECT to_char(createtime,'yyyy-mm-dd') createtime,count(*) c
  24.   FROM
  25.   mvbox_space.user_comment
  26.   where createtime>=trunc(sysdate - interval '7' day)
  27.   and createtime<trunc(sysdate)
  28.   group by to_char(createtime,'yyyy-mm-dd')
  29. ) t2 on (t1.dt=t2.createtime)
  30. ;
查询结果:


妥了


阅读(33) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册