Oracle的行转列

一,简单的行转列

做项目的时候碰到一个需求,老板有三个门店,每个门店每天都有金额入账,现在想展示某一段时间每个门店的收入情况

原表的的结构

这里在sql里面处理就比较方便,只需用到sql的decode(),和sum()函数就可以实现

1select d.md, 2sum(DECODE(rq, '星期一', je, null)) as monday, 3sum(DECODE(rq, '星期二', je, null)) as tuesday, 4sum(DECODE(rq, '星期三', je, null)) as wednesday, 5sum(DECODE(rq, '星期四', je, null)) as thursday, 6sum(DECODE(rq, '星期五', je, null)) as friday, 7sum(DECODE(rq, '星期六', je, null)) as saturday, 8sum(DECODE(rq, '星期天', je, null)) as Sunday 9from TESTHZL d 10GROUP BY d.md

效果

一小点扩展,如果需要统计这段时间的总收入

1select t.*,t.monday+t.tuesday+t.wednesday+t.thursday+t.friday+t.saturday+t.Sunday count from ( 2select d.md, 3sum(DECODE(rq, '星期一', je, null)) as monday, 4sum(DECODE(rq, '星期二', je, null)) as tuesday, 5sum(DECODE(rq, '星期三', je, null)) as wednesday, 6sum(DECODE(rq, '星期四', je, null)) as thursday, 7sum(DECODE(rq, '星期五', je, null)) as friday, 8sum(DECODE(rq, '星期六', je, null)) as saturday, 9sum(DECODE(rq, '星期天', je, null)) as Sunday 10from TESTHZL d 11GROUP BY d.md)t

很简单就实现了

二,思考与扩展

现在假如我们有一个需求,在某一年级,有三个班级,每个班级取总分前三的尖子生,比较每个班级的情况(与行转列无关的就不涉及了,例如怎么取班级分数前三的尖子生)

原始表字段结构

数据格式

1SELECT class, 2max(decode(r,1,student,null)) student1, 3max(decode(r,1,count,null)) count1, 4max(decode(r,1,chinese,null)) chinese1, 5max(decode(r,2,student,null)) student2, 6max(decode(r,1,count,null)) count2, 7max(decode(r,1,chinese,null)) chinese2, 8max(decode(r,3,student,null)) student3, 9max(decode(r,1,count,null)) count3, 10max(decode(r,1,chinese,null)) chinese3 11from ( 12select t.*,row_number() 13over(partition by class order by student ) r 14from CLASS_TOPSTUDENT t 15) 16group by class

 主要是 max()   over   (PARTITION   BY   ...)   这个分析函数的应用

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Twitter的分布式自增ID算法snowflake (Java版)

概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移