`
李科笠
  • 浏览: 64375 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

总结一下关于行列转置的实现方法

 
阅读更多

这是行转列问题,CSDN的一位版主发的,感觉经典。所以收藏了!

总结一下关于行列转置的实现方法
1、固定列数的行列转换
如
student subject grade
--------- ---------- --------
student1 语文 80
student1 数学 70
student1 英语 60
student2 语文 90
student2 数学 80
student2 英语 100
……
转换为
语文 数学 英语
student1 80 70 60
student2 90 80 100
……
语句如下:select student, 
sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'数学', grade,null)) "数学",
sum(decode(subject,'英语', grade,null)) "英语"
from table
group by student;
 

2、不定列行列转换
如
c1 c2
--- -----------
1 我
1 是
1 谁
2 知
2 道
3 不
……
转换为
1 我是谁
2 知道
3 不

这一类型的转换可以借助于PL/SQL来完成,这里给一个例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
RETURN VARCHAR2
IS
Col_c2 VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
Col_c2 := Col_c2||cur.c2;
END LOOP;
Col_c2 := rtrim(Col_c2,1);
RETURN Col_c2;
END;

select distinct c1 ,get_c2(c1) cc2 from table;


或者不用pl/sql,利用分析函数和 CONNECT_BY 实现:

SELECT c1, SUBSTR (MAX (SYS_CONNECT_BY_PATH (c2, ';')), 2) NAME
    FROM (SELECT c1, c2, rn, LEAD (rn) OVER (PARTITION BY c1 ORDER BY rn) rn1
            FROM (SELECT c1, c2, ROW_NUMBER () OVER (ORDER BY c2) rn
                    FROM t))
START WITH rn1 IS NULL
CONNECT BY rn1 = PRIOR rn
GROUP BY c1;


3、列数不固定(交叉表行列转置)
这种是比较麻烦的一种,需要借助pl/sql:

原始数据:
CLASS1     CALLDATE         CALLCOUNT
1          2005-08-08       40
1          2005-08-07       6
2          2005-08-08       77
3          2005-08-09       33
3          2005-08-08       9
3          2005-08-07       21

转置后:
CALLDATE     CallCount1 CallCount2 CallCount3
------------ ---------- ---------- ----------
2005-08-09   0          0          33
2005-08-08   40         77         9
2005-08-07  6      0          21

试验如下:
1). 建立测试表和数据
CREATE TABLE t(
    class1 VARCHAR2(2 BYTE),
    calldate DATE,
    callcount INTEGER
);

INSERT INTO t(class1, calldate, callcount)
VALUES ('1', TO_DATE ('08/08/2005', 'MM/DD/YYYY'), 40);

INSERT INTO t(class1, calldate, callcount)
VALUES ('1', TO_DATE ('08/07/2005', 'MM/DD/YYYY'), 6);

INSERT INTO t(class1, calldate, callcount)
VALUES ('2', TO_DATE ('08/08/2005', 'MM/DD/YYYY'), 77);

INSERT INTO t(class1, calldate, callcount)
VALUES ('3', TO_DATE ('08/09/2005', 'MM/DD/YYYY'), 33);

INSERT INTO t(class1, calldate, callcount)
VALUES ('3', TO_DATE ('08/08/2005', 'MM/DD/YYYY'), 9);

INSERT INTO t(class1, calldate, callcount)
VALUES ('3', TO_DATE ('08/07/2005', 'MM/DD/YYYY'), 21); 

COMMIT ; 

2). 建立ref cursor准备输出结果集 
CREATE OR REPLACE PACKAGE pkg_getrecord
IS
    TYPE myrctype IS REF CURSOR;
END pkg_getrecord;
/

3). 建立动态sql交叉表函数,输出结果集 
CREATE OR REPLACE FUNCTION fn_rs
    RETURN pkg_getrecord.myrctype
IS
    s VARCHAR2 (4000); 
    CURSOR c1 IS
    SELECT ',sum(case when Class1='
            || class1
            || ' then CallCount else 0 end)'
            || ' "CallCount'
            || class1
            || '"' c2
    FROM t
    GROUP BY class1;
    r1 c1%ROWTYPE;
    list_cursor pkg_getrecord.myrctype;
BEGIN
    s := 'select CallDate ';
    OPEN c1;
    LOOP
        FETCH c1 INTO r1;
        EXIT WHEN c1%NOTFOUND;
        s := s || r1.c2;
    END LOOP;
    CLOSE c1;
    s := s || ' from T group by CallDate order by CallDate desc ';
    OPEN list_cursor FOR s;
    RETURN list_cursor;
END fn_rs;
/ 

4). 测试在sql plus下执行:
var results refcursor;
exec :results := fn_rs;
print results;
CALLDATE        CallCount1 CallCount2 CallCount3
--------------- ---------- ---------- ----------
2005-08-09      0          0          33
2005-08-08      40         77         9
2005-08-07      6          0          21

 

 

 

分享到:
评论

相关推荐

    通过SQL语句实现行列转换的几种方法

    ### 通过SQL语句实现行列转换的几种方法 在日常工作中,我们经常需要处理的数据结构并不总是按照我们期望的方式组织的。特别是在制作自定义报表或进行产品开发时,经常会遇到需要将数据从一种布局转换到另一种布局...

    oracle行列转换总结

    本文将深入探讨Oracle中实现行列转换的几种方法,包括使用`UNION ALL`、`MODEL`子句以及集合类型(`collections`),并提供具体的示例来帮助理解。 ### 1. 使用`UNION ALL`进行行列转换 `UNION ALL`是一种简单直接的...

    C#实现DataGridView控件行列互换的方法

    总结起来,C#实现DataGridView控件行列互换的方法主要包括以下几个步骤: 1. 初始化两个DataGridView控件,设置行头宽度和自动调整列宽的属性。 2. 创建一个DataTable对象,填充数据,并将其设置为dgvLeft的数据源...

    行列转换总结.pdf

    ### 行列转换总结 #### 一、概述 在数据处理和分析中,经常会遇到需要对数据表中的行列结构进行转换的情况。这类操作通常被称为“行列转换”。本篇文档将针对行列转换的六种常见情况进行详细的说明,并通过具体的...

    sql server 行列转换

    本次提供的示例是通过动态SQL来实现行列转换的功能。下面我们将详细解析这段代码: 1. **创建测试表**: ```sql CREATE TABLE test (name CHAR(10), km CHAR(10), cj INT) GO INSERT test VALUES ('', '', 80) ...

    table行列数据转换

    总结,C#中实现“table动态行列数据转换”涉及多种方法,从基础的数据结构操作到高级的LINQ技巧,可以根据具体需求选择合适的方式。理解并熟练运用这些方法,将使你在处理数据时更加得心应手。在实践过程中,不断...

    Excel2021教程:表格数据行列转置.docx

    * 粘贴数据并选择转置是实现行列转置的关键步骤。 * 查看转置后的数据是检查数据正确性和完整性的重要步骤。 应用场景: * 数据分析:在数据分析中,行列转置可以用于快速地将数据从行转换为列,或者从列转换为行...

    Sql语句实现表的行列转换,行转列,列转行

    通过上述方法,我们成功地实现了表格数据的行列转换。这种方法不仅适用于本例中的简单情况,也可以扩展到更复杂的数据转换场景中。需要注意的是,在实际应用中还需要考虑数据量大小、性能等因素,合理选择合适的实现...

    Oracle 行列转换 总结

    Oracle 行列转换总结 Oracle 行列转换是指在 Oracle 数据库中将行与列之间进行转换的操作。这种转换有六种情况:列转行、行转列、多列转换成字符串、多行转换成字符串、字符串转换成多列、字符串转换成多行。 1. ...

    excel行列转换程序

    在Excel中,虽然没有直接的函数来实现行列转换,但可以通过一些技巧来达到类似的效果。而在更高级的数据处理环境中,如SQL Server 2005,提供了专门的`PIVOT`和`UNPIVOT`运算符来支持这些转换。 #### 二、PIVOT ...

    Oracle行列转换_总结

    本文档提供了Oracle中行列转换的六个常见案例及其具体实现方法。这些转换技巧对于提高数据库查询效率、简化数据处理流程等方面具有重要意义。通过上述示例的学习,读者可以更好地理解如何利用Oracle的内置功能来满足...

    行列转,换行列转换

    #### 三、SQL中的行列转换实现方法 在SQL中,实现行列转换主要通过以下几种方式: 1. **CASE WHEN 语句**:通过CASE WHEN结构来判断条件,进而实现列值的变化。 2. **PIVOT 函数**:部分数据库系统支持PIVOT函数,...

    行业分类-设备装置-面向数据库一体机的内存数据仓库行列存储转换实现方法.zip

    针对标题“行业分类-设备装置-面向数据库一体机的内存数据仓库行列存储转换实现方法”,我们将探讨内存数据仓库与行列存储转换的重要性和具体实现方法。 内存数据仓库是现代数据分析中的关键组件,它将数据存储在...

    sql查询中行列转换

    本篇文章将详细解释如何通过一条SQL查询语句实现行列转换,并且会针对两种不同的SQL Server版本(SQL Server 2000和SQL Server 2005)来探讨具体的实现方法。 ### 数据准备 首先,我们需要构建一个简单的数据表...

    行列转换SQL存储过程代码

    本篇文章将深入探讨一个SQL存储过程的实现方式,该存储过程主要用于完成“行转列”(即行列转换)的操作。通过这种方式,可以有效地将数据库表中的行数据转换为列的形式进行展示或处理,这对于数据分析和报告生成等...

    Oracle 行列转换总结

    本文档将详细讲解Oracle数据库中的行列转换方法,并通过具体实例来说明每一种转换方式的应用场景。 #### 二、列转行 **2.1 使用 UNION ALL 实现列转行** 适用于Oracle 8i、9i、10g及以上版本。 - **步骤与示例**...

    一道java面试题 行列转换

    通过对以上两种数据库环境下的行列转换方案的学习,我们可以看到,无论是 SQL Server 还是 Oracle,在实现上都采用了相似的逻辑,即通过条件判断来实现行列转换。不同的数据库可能支持的函数或语法有所不同,但基本...

    sqlserver2005 行列转换实现方法

    以下将详细讲解如何在SQL Server 2005中实现这种转换。 首先,我们来看两个示例表格:`Company` 和 `Product`。`Company` 表格存储公司信息,包括公司ID(ComID)、公司名称(ComName)、公司编号(ComNumber)以及...

    C# Datatable数据Excel导出和行列转换

    本文将详细介绍如何使用 C# 实现 DataTable 数据到 Excel 的导出以及行列转换的方法。 #### 二、关键知识点解析 ##### 1. 行转列(行列转换) 在 C# 中,可以利用 DataTable 对象来实现行列转换。具体来说,可以...

Global site tag (gtag.js) - Google Analytics