行转列之随着记录数增加,列数不固定,且不是多少条行边多少列
来源:互联网 发布:淘宝开店上货教程 编辑:程序博客网 时间:2024/05/17 23:02
具体描述不出来,看图片:
附上建表语句:
create table TAB1( id VARCHAR2(6), iname VARCHAR2(20), sno VARCHAR2(6))
insert into tab1(id,iname,sno) values('1001','abcde','s001');insert into tab1(id,iname,sno) values('1002','hijk','s002');insert into tab1(id,iname,sno) values('1002','hijk','s003');insert into tab1(id,iname,sno) values('1003','xyz','s001');insert into tab1(id,iname,sno) values('1003','xyz','s003');insert into tab1(id,iname,sno) values('1003','xyz','s004');insert into tab1(id,iname,sno) values('1004','abc','s005');insert into tab1(id,iname,sno) values('1004','abc','s006');insert into tab1(id,iname,sno) values('1005','def','s002');insert into tab1(id,iname,sno) values('1005','def','s004');
需要实现的是
根据上一个blog写的方法,可以一步一步的想
第一步,明显需要的结果中是根据ID 或者INAME分组且按窗口排序,这时想到如下sql:
SELECT 'SELECT id,iname,' || WMSYS.WM_CONCAT('MAX(DECODE(sn,''' || SN || ''',sno)) AS "供应商' || SN || '"') || ' FROM (SELECT id, iname, sno, ROW_NUMBER() OVER(PARTITION BY id ORDER BY sno) sn FROM tab1) GROUP BY id,iname' FROM (SELECT ID, INAME, SNO, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY SNO) SN FROM TAB1);
会得到如下的结果:
SELECT ID, INAME, MAX(DECODE(SN, '1', SNO)) AS "供应商1", MAX(DECODE(SN, '1', SNO)) AS "供应商1", MAX(DECODE(SN, '2', SNO)) AS "供应商2", MAX(DECODE(SN, '1', SNO)) AS "供应商1", MAX(DECODE(SN, '2', SNO)) AS "供应商2", MAX(DECODE(SN, '3', SNO)) AS "供应商3" FROM (SELECT ID, INAME, SNO, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY SNO) SN FROM TAB1) GROUP BY ID, INAME
但是显然不是我们所需要的,因为列数重复了,且多了
于是,又想到第二步,可以在最外面的表中,只查到唯一的sn,所以有如下的SQL:
SELECT 'SELECT id,iname,' || WMSYS.WM_CONCAT('MAX(DECODE(sn,''' || SN || ''',sno)) AS "供应商' || SN || '"') || ' FROM (SELECT id, iname, sno, ROW_NUMBER() OVER(PARTITION BY id ORDER BY sno) sn FROM tab1) GROUP BY id,iname ORDER BY id;' FROM (SELECT DISTINCT ROW_NUMBER() OVER(PARTITION BY ID ORDER BY SNO) SN FROM TAB1);
得到sql如下:
SELECT ID, INAME, MAX(DECODE(SN, '1', SNO)) AS "供应商1", MAX(DECODE(SN, '2', SNO)) AS "供应商2", MAX(DECODE(SN, '3', SNO)) AS "供应商3" FROM (SELECT ID, INAME, SNO, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY SNO) SN FROM TAB1) GROUP BY ID, INAME ORDER BY ID;
至此,达到我们的需求
这是我上篇blog的活学活用,虽然例子是我朋友的,但是也给他解决了很久之前的一个问题,吼吼
0 0
- 行转列之随着记录数增加,列数不固定,且不是多少条行边多少列
- 固定每次增加多少sql
- 固定Textview,字体随着字数的多少字体动态变化大小
- HTML控制表格列不会跟着字的多少改变,且控制列的长度
- 多少
- 多少
- 多少
- hive里如何快速查看表中有多少记录数
- 汇编:分别将正数负数输出 并输出各有多少个正负数 代码: ;目的是判断有多少个正数并输出 且输出正数有多少个 负数输出 且输出有多少个
- 求1234四个数能组成多少互不相同且不重复的三位数
- 字段个数(多少列)
- LightOJ 1278 一个固定数可以换为几个连续数之和 求这样的连续数有多少对
- Input文本框随着输入内容多少自动延伸
- 人生有多少个现在 且行且珍惜
- 练习题目4. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位 数?都是多少?
- 有1,2,3,4这四个数,能组成多少互补相同且无重复的三位数字,都是多少?
- 有1,2,3,4四个数,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 查询任意多少条记录到多少条记录
- C语言的数组名和对数组名取地址
- poj2586
- 这是我的第一篇文章
- Cocos2d-x schedule用法
- 关于android中自定义contentprovider的使用
- 行转列之随着记录数增加,列数不固定,且不是多少条行边多少列
- xUbuntu下设置eclipse 快捷键(ctrl + alt + down)
- 接口与抽象类的不同
- Spring注解
- C语言强符号和弱符号
- 云部落上线了,欢迎访问哈
- Local declaration of tableview hides instance variable 警告
- css:float浮动元素
- android IntentService的深入理解