- 浏览: 116063 次
文章分类
来源:http://www.itpub.net/thread-1156433-1-1.html
cjh2000提问:
现有数据表中的数据形式为:
名称 数量 单价
a 4 10
b 2 8
现在能否通过一个SQL语句将其变成:
名称 数量 单价
a 1 10
a 1 10
a 1 10
a 1 10
b 1 8
b 1 8
grova解答:
表已创建。
已创建 1 行。
已创建 1 行。
NAME NUM PRICE
---------- ---------- ----------
a 1 10
a 1 10
a 1 10
a 1 10
b 1 8
b 1 8
已选择6行。
atgc解答:
NA F1 F2
-- ---------- ----------
a 4 10
b 2 8
RN
----------
1
2
3
4
NA F1 F2
-- ---------- ----------
a 1 10
a 1 10
a 1 10
a 1 10
b 1 8
b 1 8
6 rows selected.
转帖:利用整数表解决复杂SQL查询——案例二
http://space.itpub.net/15203236/viewspace-590898
问题描述:
Count汇聚一组行,并告诉每一组有多少行数据。但是,如果想得到相反的过程,将汇聚结果回推到多行数据时,该怎么办呢?
一旦得到了汇聚数据,将其分离开来就会十分棘手。例如,有一个包含宾馆房间预订的表bookings,每一行都有一个指明预订第一夜的日期、总费用以及预订天数。
Startwhn
Visitprice
Nights
2005-01-01
100
2
2005-02-01
200
5
在已知这些信息的情况下,弄清楚某个特定夜晚被预订了多少个房间是件困难的事情。我们希望处理这些信息,以便得到这样的结果:客人停留的每一夜都包含一行。Desired表的格式如下:
Startwhn
Whn
prices
2005-01-01
2005-01-01
50
2005-01-01
2005-01-02
50
2005-02-01
2005-02-01
40
2005-02-01
2005-02-02
40
2005-02-01
2005-02-03
40
2005-02-01
2005-02-04
40
2005-02-01
2005-02-05
40
很容易从desired得到booking,但这是我们需要做的事情的反过程:
Select startwhn,sum(price),count(price)
From desired group by startwin;
解决方案:
从booking得到desired需要更深入的思考,可是通过使用一个整数表来解决这个问题:
Integers表包含了单个列,保存了从1到某个更大整数之间的数字,在本问题的情况下,integers表至少要达到任何客人预订的最大天数。这样:
Create table integers(n int primary key);
Insert into integers values(1);
Insert into integers values(2);
Insert into integers values(3);
Insert into integers values(4);
Insert into integers values(5);
……..
或者也可以这样来实现插入数据:
Insert into integers select rownum rn from dual connect by level<=5;
在各种查询中integers都是一个有用的表,生成desired表的关键是将integers交叉连接到bookings上,使用条件n不大于nights:
SQL> select startwhn,startwhn+n-1 as whn, visitprice/nights as price
2 from bookings,integers
3 where n between 1 and nights;
STARTWHN WHN PRICE
-------------- -------------- ----------
01-1月-05 01-1月-05 50
01-1月-05 02-1月-05 50
01-2月-05 01-2月-05 40
01-2月-05 02-2月-05 40
01-2月-05 03-2月-05 40
01-2月-05 04-2月-05 40
01-2月-05 05-2月-05 40
已选择7行。
cjh2000提问:
现有数据表中的数据形式为:
名称 数量 单价
a 4 10
b 2 8
现在能否通过一个SQL语句将其变成:
名称 数量 单价
a 1 10
a 1 10
a 1 10
a 1 10
b 1 8
b 1 8
grova解答:
SQL> create table tt(name varchar2(10),num number,price number);
表已创建。
SQL> insert into tt values('a',4,10);
已创建 1 行。
SQL> insert into tt values('b',2,8);
已创建 1 行。
SQL> commit;
SQL> select name,1 num,price 2 from tt,(select rownum rn from dual connect by level<=5) 3 where rn between 1 and num 4 order by name;
NAME NUM PRICE
---------- ---------- ----------
a 1 10
a 1 10
a 1 10
a 1 10
b 1 8
b 1 8
已选择6行。
atgc解答:
SQL> select * from test;
NA F1 F2
-- ---------- ----------
a 4 10
b 2 8
SQL> select * from test2;
RN
----------
1
2
3
4
SQL> select a.name,1 f1,a.f2 from test a,test2 b 2 where b.rn<=a.f1;
NA F1 F2
-- ---------- ----------
a 1 10
a 1 10
a 1 10
a 1 10
b 1 8
b 1 8
6 rows selected.
转帖:利用整数表解决复杂SQL查询——案例二
http://space.itpub.net/15203236/viewspace-590898
问题描述:
Count汇聚一组行,并告诉每一组有多少行数据。但是,如果想得到相反的过程,将汇聚结果回推到多行数据时,该怎么办呢?
一旦得到了汇聚数据,将其分离开来就会十分棘手。例如,有一个包含宾馆房间预订的表bookings,每一行都有一个指明预订第一夜的日期、总费用以及预订天数。
Startwhn
Visitprice
Nights
2005-01-01
100
2
2005-02-01
200
5
在已知这些信息的情况下,弄清楚某个特定夜晚被预订了多少个房间是件困难的事情。我们希望处理这些信息,以便得到这样的结果:客人停留的每一夜都包含一行。Desired表的格式如下:
Startwhn
Whn
prices
2005-01-01
2005-01-01
50
2005-01-01
2005-01-02
50
2005-02-01
2005-02-01
40
2005-02-01
2005-02-02
40
2005-02-01
2005-02-03
40
2005-02-01
2005-02-04
40
2005-02-01
2005-02-05
40
很容易从desired得到booking,但这是我们需要做的事情的反过程:
Select startwhn,sum(price),count(price)
From desired group by startwin;
解决方案:
从booking得到desired需要更深入的思考,可是通过使用一个整数表来解决这个问题:
Integers表包含了单个列,保存了从1到某个更大整数之间的数字,在本问题的情况下,integers表至少要达到任何客人预订的最大天数。这样:
Create table integers(n int primary key);
Insert into integers values(1);
Insert into integers values(2);
Insert into integers values(3);
Insert into integers values(4);
Insert into integers values(5);
……..
或者也可以这样来实现插入数据:
Insert into integers select rownum rn from dual connect by level<=5;
在各种查询中integers都是一个有用的表,生成desired表的关键是将integers交叉连接到bookings上,使用条件n不大于nights:
SQL> select startwhn,startwhn+n-1 as whn, visitprice/nights as price
2 from bookings,integers
3 where n between 1 and nights;
STARTWHN WHN PRICE
-------------- -------------- ----------
01-1月-05 01-1月-05 50
01-1月-05 02-1月-05 50
01-2月-05 01-2月-05 40
01-2月-05 02-2月-05 40
01-2月-05 03-2月-05 40
01-2月-05 04-2月-05 40
01-2月-05 05-2月-05 40
已选择7行。
发表评论
-
How-to Install Oracle 12c Database on CentOS 6.X 64bit
2014-04-29 03:21 961http://blog.csdn.net/chncaesar ... -
ORA-12537相关?【转载】查看、修改ORACLE最大进程数
2013-08-28 17:00 1330客户端无法连接数据库,报错ORA-12537,此时登录EM后, ... -
[转]mysql中如何重命名数据库 转自运维人生http://opkeep.com
2013-06-24 11:19 824来源:http://opkeep.com/database/m ... -
64位Ubuntu 安装MySQL 5.5.32 错误记录与解决
2013-06-21 19:50 10861. dev.mysql.com/downloads 下载ta ... -
[转]mysql忘记root密码怎么办?重设Mysql密码的方法
2013-06-21 11:36 1122转自:http://it.oyksoft.com/ ... -
char类型补空格引发的案子
2013-06-17 10:24 1389不多说,都懂的: create table test( c ... -
ORA-28547: 连接服务器失败, 可能是 Oracle Net 管理错误
2013-06-14 15:37 1873问题描述:Navicat 10.0.10 Premium 连 ... -
[转]"ORA-22992: 无法使用从远程表选择的 LOB 定位器"解决方法
2013-06-09 11:06 2550转载自http://blog.csdn.net/weikaif ... -
Oracle通过EM查看具体SQL的执行计划和统计信息
2013-05-27 18:33 1277tableA.columnB上建索引 执行查询 select ... -
其他机器连不上本地infobright,报错'reading initial communication packet', system error: 0
2013-05-20 14:59 1888装好infobright之后,无法在其他机器连接本地ib(ro ... -
非正常关机;[ERROR 2002 (HY000);mysqld无法启动;innodb recovery失败
2013-05-17 16:24 1609os:ubuntu 11.10 db: mysql 旧5.1. ... -
windows oracle 11.2.0.1.0 dump blob 到 windows oracle 10.2.0.1.0
2013-05-17 12:02 763source_server expdp src_usr/pwd ... -
[转载]dg v.s. streams v.s. gg
2013-05-06 16:02 778Tom Said: As for setting up the ... -
解决Oracle TEMP临时表空间数据文件过大
2013-05-06 10:11 1694create temporary tablespace tem ... -
产品详情页面加载慢(之前约7s-12s)
2013-04-27 12:03 783问题场景:客户反应网站上的产品详情页面打开时,速度很慢。 运行 ... -
工作中遇到的SQL Server索引相关问题(过多、缺失、启用)
2013-04-27 11:07 2059直接上菜! 问题场景1 ... -
记一次MySQL死锁(对同一张表update和insert)的解决
2013-04-27 02:07 21015问题场景 每次节 ... -
万恶的隐式数据类型转换
2013-04-26 17:23 11222年前上线的系统了,运 ... -
oracle 11.2.0.1 result_cache
2013-04-25 04:27 747alter system set result_cache_m ... -
oracle 重启
2013-04-25 04:23 0重启em emctl stop dbconsole emctl ...
相关推荐
oracle数据库一行拆成多行.sql
oracle纯SQL语句多行合并一行,中间用“,”隔开,方便快速的显示在页面上
oracle10g,9i多行合并一行函数
oracle某个字段多行记录转化为一行,oracle某个字段多行记录转化为一行。
SQL语句用with将列分割成多列存为临时表,再将多行某个字段拼接合并为一行
Oracle多行记录合并/连接/聚合字符串的几种方法
介绍了将多行转为字符串的三种方案,并比较了三种方案的执行效率. 1.sys_connect_by_path + start with ... connect by ... prior + 分析函数 2.自定义Function/SP 3.使用 Oracle 10g 内置函数 wmsys.wm_concat
Oracle 分割字符串 返回多行数据
工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比。 单行拆分 如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如: select regexp_substr('444.555.666', '[^...
oracle 某列存儲的值是有逗號的字符串,希望通過逗號分隔開來顯示多行。sql,有預期結果,有項目實戰。
不做详解,直接上图。 SELECT T.NAME, T.TESTSTR FROM TEST2 T; SELECT DISTINCT T.NAME, REPLACE(REGEXP_SUBSTR(T.TESTSTR, '[^,]+', 1, LEVEL), ',', ' ') TESTSTR FROM TEST2 T WHERE 1 = 1 ...
Oracle插入多行实例,简单介绍了oracle插入多行的实例
比如一个字段'11,22,22,33,44',一个查询语句显示成4行,就可以这样来实现。 11 22 22 33 44
本文实例讲述了oracle实现多行合并的方法。分享给大家供大家参考。具体分析如下: 在写sql时,经常会有将某列的字段合并起来,比如将某人名下每个月的工资列示,但是每个人只能占一行。 像这种场景,可能用行列转换...
java调用oracle输出参数为多行多列的结构化数组的存储过程,并将其遍历解析;该demo部署后,只需要配置poolman.xml数据源,即可运行;
多行记录合并 采用的是方法4,希望对你们有用
1.被集合字段范围小且固定型 灵活性 性能 难度 2.固定表固定字段函数法 灵活性 性能 难度 3.灵活表函数法 灵活性 性能 难度 4.一条SQL法 灵活性
表中数据多行转1行多列