`
beliveAda
  • 浏览: 112572 次
  • 性别: Icon_minigender_2
  • 来自: 西安
社区版块
存档分类
最新评论

关于oracle和db2中的纵表转横表的例子

 
阅读更多
在数据库开发的过程中,经常会遇到把纵表的数据转换为横表展示出来。今天我就把经常遇到的实现的方法总结出来,还请大家指点错误啊。或者有更好的方法,也可以让我学习学习。
     ---以下脚本是在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中的对树的递归查询语句

    DB2虽然没有直接提供类似Oracle的`CONNECT_BY`功能,但可以通过自连接和临时表的方式来实现递归查询。一个典型的例子是使用`WITH RECURSIVE`子句: ```sql WITH RECURSIVE employee_tree (level, employee_id, ...

    Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出

    在文中提到的例子中,即使为列添加了索引,`ORDER BY`操作仍然没有按照预期进行,这主要是因为`ROWNUM`不是一个稳定的排序依据,它只是表示查询结果集的顺序,而不是数据本身的物理存储顺序。 `ROWID`是Oracle...

    DB2数据库用户手册

    - **UPDATE不能用一个表中的记录为条件修改另一个表中的记录**:DB2不支持跨表更新操作。 - **如果显示调用存储过程时传NULL值要注意**:在调用存储过程时传递NULL值可能会导致意外行为。 #### 四、DB2编程性能注意...

    数据业务工程师DB2入门指南

    - Oracle和DB2在数据库的设计理念、存储方式等方面存在一定的差异,需要在迁移过程中加以注意。 - **1.5.2 表空间数据文件的差异** - Oracle的表空间数据文件通常较小且数量较多,而DB2则倾向于使用较大的数据...

    通用(oracle DB2 )数据库设计范式

    ### 通用(oracle DB2)数据库设计范式详解 #### 一、引言 数据库设计范式是确保数据库设计质量的重要原则,它旨在减少数据冗余并提高数据完整性。范式化过程通常遵循一系列规则,从第一范式(1NF)至第五范式(5NF),每...

    jdbc和odbc连接字符串 Oracle SQL MySQL DB2 Access Sybase Informix PostgreSQL

    本篇文章将详细介绍这两种方式,并提供Oracle、SQL、MySQL、DB2、Access、Sybase、Informix、PostgreSQL等常见数据库的连接字符串示例。 1. JDBC(Java Database Connectivity)是Java平台的标准接口,允许Java应用...

    DB2使用经验积累PDF

    - **UPDATE不能用一个表中的记录为条件修改另一个表中的记录**:DB2不支持跨表的更新操作。 - **如果显示调用存储过程时传NULL值要注意**:在调用存储过程时,如果参数为`NULL`,可能会导致意外的行为。 #### 四、...

    DB2手册pdf

    DB2支持通过一个表中的记录来更新另一个表中的数据。这可以通过嵌套查询或JOIN语句实现。 #### 如果显示调用存储过程时传NULL值要注意 在调用存储过程时传递NULL值,需要确保存储过程正确处理这些值,避免出现意外...

    DB2学习手册

    ### DB2学习手册知识点概述 #### 一、DB2专有名词解释 1. **Instance(实例):** DB2中的实例是指运行DB2数据库管理系统的单一进程...以上内容提供了关于DB2的深入理解和实用技巧,帮助读者更好地掌握DB2的使用和管理。

    DB2递归实现

    在本文中,我们将使用一个实用的例子来描述如何将CONNECT BY和相关的伪列映射到DB2递归。我们将定义和填充一个雇员表,然后使用递归查询来回答一些问题,例如“谁是‘Goyal’直接或间接的属下?” 首先,我们需要...

    DB2使用经验积累及心得

    - **DB2ADMINISTRATION SERVER(管理服务器)**:负责管理DB2环境中的多个数据库实例和服务,提供集中式的管理和监控功能。 - **CONTAINER(容器)**:在DB2中用来组织和管理文件空间的一种逻辑结构,可以包含一个或...

    用一条SQL语句将数据表中某列更新到另一个数据表里

    目标是在表T1和T2之间建立关联,并根据T1中的A1列与T2中的A11列是否相等,将T1中A2列的数据更新为T2中相应的A22列的值。 #### 示例数据 - 表T1: | A1 | A2 | A3 | |----|----|----| | 1 | | 21 | | 2 | | 22 | ...

    DB2使用经验积累

    25. **类似于ORACLE的TRUNCATE清表但不记日志的做法**:DB2提供了`TRUNCATE TABLE`语句来快速清除表中的所有数据,而不会生成日志记录。 26. **用CLI编程批量的insert**:可以使用DB2 CLI(Client Library)提供的`...

    经常要用的DB2优化

    在DB2中,全表扫描是指数据库系统读取整个表的数据来进行查询的过程。这种方式效率极低,尤其是在处理大型数据库时,可能导致性能瓶颈。以下是一些减少全表扫描的方法: 1. **减少使用NOT、!=、等操作符**:这些...

    C# oledb 连接DB2数据库实例(源代码)

    首先,我们需要了解OLEDB是微软提出的一种统一的数据访问接口,它允许开发者通过标准的方式访问多种数据源,包括但不限于SQL Server、Oracle和DB2等。在C#中,我们通常会使用`System.Data.OleDb`命名空间中的类来...

    OTL源码(附例子)

    OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,进行操作DB2数据库则是通过CLI接口来进行,至于MS的数据库和其它一些数据库,则OTL只提供了ODBC来操作的方式。当然Oracle和DB2也可以由OTL间接使用ODBC的...

Global site tag (gtag.js) - Google Analytics