`

[整理]一行变多行(Oracle)

sql 
阅读更多
来源: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解答:
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行。
分享到:
评论

相关推荐

    Oracle多行记录合并

    在Oracle数据库中,多行记录的合并通常是为了将相同字段的多行数据整合成一行,以便于数据分析或者简化展示。这种操作在报表制作、数据整理等场景中非常常见。本篇文章将详细介绍Oracle中实现多行记录合并的几种方法...

    oracle自己整理的管理方面资料2

    嵌套表是Oracle数据库中的一种复杂数据类型,允许在一个列中存储多个行。这份文档可能详细介绍了如何创建、操作和管理嵌套表,以及它们在处理复杂数据结构时的优势和注意事项。 5. **使用values of.txt** Oracle ...

    Oracle笔记整理

    - 主键和外键:主键用于唯一标识表中的每一行,外键用于建立表之间的引用关系。 - 唯一性约束:确保字段值的唯一性,可以提高查询性能和数据完整性。 - 索引:创建索引以加快查询速度,但需平衡查询性能和额外的...

    Oracle游标使用方法及语法大全[整理].pdf

    它默认处理单行结果,如果查询结果只有一行,可以直接将数据赋值给变量。当查询完成,隐式游标会自动关闭。然而,如果查询返回多行,隐式游标无法直接处理,这时就需要使用显式游标。 2. **显式游标**:显式游标...

    1Z0-071 Oracle Database SQL

    INSERT语句可以一次插入多行数据。UPDATE语句能够基于多个条件同时修改多个行的数据。DELETE语句能够根据单个条件从表中删除多行数据。在多条件操作中,如果需要基于多个条件进行数据插入或删除,可以使用嵌套的...

    oracle错误码大全

    为解决这个问题,需要修改查询以确保只返回一行,或者使用其他数据存储结构来处理多行结果。 "ORA-01555"错误是"快照过旧",意味着在读取数据时,由于回滚段空间不足,无法获取到事务开始时的数据状态。这可能需要...

    oracle内部讲义36.pptx

    单行函数,正如其名,会对每一行数据执行一次,并返回一行结果。它们可以用于处理字符、数字和日期类型的数据,并可以嵌套使用。 字符函数在处理文本数据时非常有用。例如,`LOWER`函数将所有字母转换为小写,`...

    Oracle EBS 开发笔记

    #### 一、Oracle EBS 入门与概述 - **Oracle EBS (Enterprise Business Suite)**:是Oracle公司提供的一套完整的业务管理解决方案,适用于企业的财务管理、供应链管理、人力资源管理和客户服务等多个领域。 - **...

    1z0-071(20181026)-芝麻开门.pdf

    - INSERT INTO VALUES语句在一次执行中可以向表中添加多行数据,选项A是正确的。 以上内容基于提供的文档信息整理而成。由于文档内容有OCR扫描的不确定性,以上知识点可能需要在实际教材或官方文档中进一步核对以...

    SQL中如何实现行转列.rar

    在传统的表格数据中,每一行代表一个记录,每一列代表一个属性。但在某些场景下,如比较不同时间段的数据或展示多维度信息,将行数据转换为列可以使得数据更直观、易读。 SQL中实现行转列的方法主要有以下几种: 1...

    SQL数据库语句大全完全整理版.doc

    - **FETCH**: 从游标中获取一行数据。 - **CLOSE**: 关闭游标,释放资源。 - **PREPARE**: 预编译SQL语句,以提高执行效率。 - **EXECUTE**: 动态执行已预编译的SQL语句。 - **DESCRIBE**: 描述预编译的查询,...

    071题库-2019-10-21核对版.pdf

    题库中第27题的答案强调了dual表只能显示单行多列,不能显示多行多列,这是因为dual表本质上就是一行数据,用于特定的查询场景。 2. **常见题型与答案**:题库中列举了多道选择题的参考答案。例如第1题参考答案为A...

    sql语句格式化工具

    2. **换行处理**:根据特定的规则(如关键字后换行、函数参数间换行等)自动调整语句的换行位置,避免一行中出现过长的代码。 3. **括号对齐**:确保SQL语句中的括号(如WHERE条件、JOIN子句等)对齐,提高视觉效果...

    数据治理技术知识点整理.pdf

    每个表格称为关系,包含一系列字段(列)和记录(行)。关系数据库遵循一定的规则,如列数据类型一致,不允许字段重复,不允许多行内容完全相同,行列排列顺序无关紧要,字段必须是简单数据项而非组合数据项。此外,...

    PLSQL笔记精华,个人整理

    PL/SQL是Oracle数据库的一种编程语言,主要用于处理和操纵数据。它是SQL的扩展,增加了流程控制、异常处理和数据类型等功能,使得在数据库环境中编写复杂程序成为可能。 在PL/SQL块中,你可以直接嵌入SELECT、DML...

    PLSQL笔记整理

    - 当使用`INTO`子句时,确保`SELECT`语句最多返回一行数据。 #### 操纵数据 - **使用VALUES子句插入数据**:最简单的插入方式是直接指定每个列的值。例如: ```sql INSERT INTO employees (employee_id, name) ...

    ocp 071 资料

    以上是根据给定的文件信息整理的相关知识点,主要涵盖了 Oracle Database 12c SQL 考试中关于 SQL 语句的使用、外部表的特性以及 DML 语句的基础概念。这些知识点对于准备 1z0-071 考试的学生来说非常重要,能够帮助...

    Eclipse格式化插件(附文档)

    2. **换行处理**:插件可以自动在适当的地方插入换行,避免一行代码过长,提高代码可读性。 3. **括号风格**:根据设定,插件可以调整括号的位置,如K&R风格(每个操作符后跟一个括号)或Allman风格(每行一个括号...

    FormatSQL sql源码格式化工具

    2. **换行处理**:根据指定规则,将过长的语句适当地拆分成多行,避免一行代码过长导致阅读困难。 3. **括号对齐**:确保SQL语句中的括号(如`(`, `)`, `{`, `}`, `[`, `]`)对齐,增强代码的视觉美感。 4. **...

Global site tag (gtag.js) - Google Analytics