在数据库开发的过程中,经常会遇到把纵表的数据转换为横表展示出来。今天我就把经常遇到的实现的方法总结出来,还请大家指点错误啊。或者有更好的方法,也可以让我学习学习。
---以下脚本是在db2中实现的
第一个:纵表转横表的"SQL"示例
纵表结构: TEST_vip
acct_month 卡级别 数量
201201 钻卡 1
201201 金卡 2
201201 银卡 3
转换后显示如下
acct_month 钻卡数量 金卡数量 银卡数量
201201 1 2 3
实现思路为先将表中的数据构造成需要展示的列数,再在最外层将此值全部累加即可。
实现的sql为:
select acct_month,
sum(zk_count),
sum(jk_count),
sum(yk_count)
from (select acct_month,
case when card_level = '钻卡' then card_count end as zk_count,
case when card_level = '金卡' then card_count end as jk_count,
case when card_level = '银卡' then card_count end as yk_count
from TEST_vip
) group by acct_month;
第二个:
表结构如下:
表1 表2
字段1 字段2 字段3 字段4
A 1 A 1,2,3
A 2 B 5,6
A 3 C 7,8,9
B 5
B 6
C 7
C 8
C 9
转换要求:
使用sql实现,汇总表1字段1,字段2值用逗号隔开写入表2字段4
实现的sql为:
create table test_lyq(f1 varchar(3), f2 integer);
insert into test_lyq
values
('A',1),
('A',2),
('A',3),
('B',5),
('B',6),
('C',7),
('C',8),
('C',9);
WITH TMP(c1,c2,c3) as
(
select f1,f2,char(f2) from test_lyq
where (f1,f2) in (select f1,min(f2) from test_lyq group by f1)
union all
select t1.c1,t1.c2+1,rtrim(t1.c3)||','||rtrim(char(t2.f2)) from tmp t1 , test_lyq t2
where t1.c1 = t2.f1 and t1.c2+1 = t2.f2
)
select c1,c3 from tmp where (c1,c2) in (select f1,max(f2) from test_lyq group by f1);
分享到:
相关推荐
DB2虽然没有直接提供类似Oracle的`CONNECT_BY`功能,但可以通过自连接和临时表的方式来实现递归查询。一个典型的例子是使用`WITH RECURSIVE`子句: ```sql WITH RECURSIVE employee_tree (level, employee_id, ...
在文中提到的例子中,即使为列添加了索引,`ORDER BY`操作仍然没有按照预期进行,这主要是因为`ROWNUM`不是一个稳定的排序依据,它只是表示查询结果集的顺序,而不是数据本身的物理存储顺序。 `ROWID`是Oracle...
- **UPDATE不能用一个表中的记录为条件修改另一个表中的记录**:DB2不支持跨表更新操作。 - **如果显示调用存储过程时传NULL值要注意**:在调用存储过程时传递NULL值可能会导致意外行为。 #### 四、DB2编程性能注意...
- Oracle和DB2在数据库的设计理念、存储方式等方面存在一定的差异,需要在迁移过程中加以注意。 - **1.5.2 表空间数据文件的差异** - Oracle的表空间数据文件通常较小且数量较多,而DB2则倾向于使用较大的数据...
### 通用(oracle DB2)数据库设计范式详解 #### 一、引言 数据库设计范式是确保数据库设计质量的重要原则,它旨在减少数据冗余并提高数据完整性。范式化过程通常遵循一系列规则,从第一范式(1NF)至第五范式(5NF),每...
本篇文章将详细介绍这两种方式,并提供Oracle、SQL、MySQL、DB2、Access、Sybase、Informix、PostgreSQL等常见数据库的连接字符串示例。 1. JDBC(Java Database Connectivity)是Java平台的标准接口,允许Java应用...
- **UPDATE不能用一个表中的记录为条件修改另一个表中的记录**:DB2不支持跨表的更新操作。 - **如果显示调用存储过程时传NULL值要注意**:在调用存储过程时,如果参数为`NULL`,可能会导致意外的行为。 #### 四、...
DB2支持通过一个表中的记录来更新另一个表中的数据。这可以通过嵌套查询或JOIN语句实现。 #### 如果显示调用存储过程时传NULL值要注意 在调用存储过程时传递NULL值,需要确保存储过程正确处理这些值,避免出现意外...
### DB2学习手册知识点概述 #### 一、DB2专有名词解释 1. **Instance(实例):** DB2中的实例是指运行DB2数据库管理系统的单一进程...以上内容提供了关于DB2的深入理解和实用技巧,帮助读者更好地掌握DB2的使用和管理。
在本文中,我们将使用一个实用的例子来描述如何将CONNECT BY和相关的伪列映射到DB2递归。我们将定义和填充一个雇员表,然后使用递归查询来回答一些问题,例如“谁是‘Goyal’直接或间接的属下?” 首先,我们需要...
- **DB2ADMINISTRATION SERVER(管理服务器)**:负责管理DB2环境中的多个数据库实例和服务,提供集中式的管理和监控功能。 - **CONTAINER(容器)**:在DB2中用来组织和管理文件空间的一种逻辑结构,可以包含一个或...
目标是在表T1和T2之间建立关联,并根据T1中的A1列与T2中的A11列是否相等,将T1中A2列的数据更新为T2中相应的A22列的值。 #### 示例数据 - 表T1: | A1 | A2 | A3 | |----|----|----| | 1 | | 21 | | 2 | | 22 | ...
25. **类似于ORACLE的TRUNCATE清表但不记日志的做法**:DB2提供了`TRUNCATE TABLE`语句来快速清除表中的所有数据,而不会生成日志记录。 26. **用CLI编程批量的insert**:可以使用DB2 CLI(Client Library)提供的`...
在DB2中,全表扫描是指数据库系统读取整个表的数据来进行查询的过程。这种方式效率极低,尤其是在处理大型数据库时,可能导致性能瓶颈。以下是一些减少全表扫描的方法: 1. **减少使用NOT、!=、等操作符**:这些...
首先,我们需要了解OLEDB是微软提出的一种统一的数据访问接口,它允许开发者通过标准的方式访问多种数据源,包括但不限于SQL Server、Oracle和DB2等。在C#中,我们通常会使用`System.Data.OleDb`命名空间中的类来...
OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,进行操作DB2数据库则是通过CLI接口来进行,至于MS的数据库和其它一些数据库,则OTL只提供了ODBC来操作的方式。当然Oracle和DB2也可以由OTL间接使用ODBC的...