GVKun编程网logo

oracle 遍历查询,列转行(oracle 查询结果列转行)

1

在这篇文章中,我们将为您详细介绍oracle遍历查询,列转行的内容,并且讨论关于oracle查询结果列转行的相关问题。此外,我们还会涉及一些关于C#DataTable行转列列转行同时转换、ETL工具-

在这篇文章中,我们将为您详细介绍oracle 遍历查询,列转行的内容,并且讨论关于oracle 查询结果列转行的相关问题。此外,我们还会涉及一些关于C# DataTable 行转列 列转行 同时转换、ETL 工具 - KETTLE 教程 实例实战 4---- 转换(值映射、列转行,增加常量、增加序列等)、Hive-explode[列转行]关键字使用、hive操作(行转列,列转行)的知识,以帮助您更全面地了解这个主题。

本文目录一览:

oracle 遍历查询,列转行(oracle 查询结果列转行)

oracle 遍历查询,列转行(oracle 查询结果列转行)

--列合并
--wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行
--dbms_lob.substr 将clob转字符串
-- start with.....connect by ..=prior.. 遍历查询所有子节点的父节点
select dbms_lob.substr(wm_concat(name)) as name
  from (select name
          from table  where type=''abc''
         start with id= ''6208bcb7:164c70cf84d:-7fce''
        connect by id= prior pid
         order by levelno)

 

C# DataTable 行转列 列转行 同时转换

C# DataTable 行转列 列转行 同时转换

需求:数据库数据都是纵向的,呈现的时候要求是横向(列转行)同时看到行头(行转列)。

分析:很多报表呈现都要求要这样显示,用类是可以实现,但是代码多,又需要建很多dto。发下Excel有转置功能,但又不想牵扯Excel这一套组件。就使用DataTable来实现,代码也不多。

先看看示例数据3列10行:

 

我们要把它转成3行10列,列转行,行转列同时完成:

 

 

百度上有不少转换方案,都不尽如意。基本都是一个方向的转换。要么是行转列,要么是列转行。干脆就自己写了一个。

因为行转列,列转行要同时进行,我们需要仔细观察数据,打个下标来观察。

先把数据归类为二维数组,从转换后的表倒推回去,发现:

结果表的是【1,1】是原始表的【1,1】.

结果表的【1,2】是原始表的【2,1】,类推结果表【1,3】是原始表【3,1】

规律:下标对调就可以得到转换表

 

 

 

代码实现:

1、把源数据(包含列头)转换成二维数组,然后下标对调。这种方法使用最方便。就是要仔细算下标位置,应为列头加进去了

private DataTable PivotDatatable(DataTable dtSource, string columnFilter)
        {
            var columns = columnFilter.Split('','');
            DataTable dtFilter = dtSource.DefaultView.ToTable(false, columns);
            DataTable dtResult = new DataTable();

            var rowCount = dtFilter.Rows.Count;
            var columnCount = columns.Length;

            // 源数组的行数比DataTable的行数+1,, 加一行表头
            object[,] arrSource = new object[rowCount + 1, columnCount];

            // 目标数组的行数等于选择的列数,列数等于 源数据的行数+1, 加一列 属性名
            object[,] arrResult = new object[columnCount, rowCount + 1];

            // 原数组第一行写表头
            for (int i = 0; i < columnCount; i++)
            {
                arrSource[0, i] = dtFilter.Columns[i].ColumnName;
            }

            // 源数据 每一行写 数据
            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {
                    arrSource[i + 1, j] = dtFilter.Rows[i][j];
                }
            }

            // 原数 转置到 目标数组
            for (int i = 0; i < rowCount + 1; i++)
            {
                for (int j = 0; j < columnCount; j++)
                {
                    arrResult[j, i] = arrSource[i, j];
                }
            }

            // 创建 Datatable 的结构
            for (int i = 0; i < rowCount + 1; i++)
            {
                dtResult.Columns.Add(arrResult[0, i].ToString());
            }

            List<string> valueList = new List<string>();
            for (int i = 1; i < columnCount; i++)
            {
                for (int j = 0; j < rowCount + 1; j++)
                {
                    valueList.Add(arrResult[i, j].ToString());
                }

                dtResult.Rows.Add(valueList.ToArray());
                valueList.Clear();
            }
            return dtResult;
        }

 2、思路是数据转换成二维码(不含列头),转换完成后,再把列头加入到新的table里面,不需要过多算下标

private DataTable SwapTable(DataTable tableData)
        {
            int intRows = tableData.Rows.Count;
            int intColumns = tableData.Columns.Count;

            //转二维数组
            string[,] arrayData = new string[intRows, intColumns];
            for (int i = 0; i < intRows; i++)
            {
                for (int j = 0; j < intColumns; j++)
                {
                    arrayData[i, j] = tableData.Rows[i][j].ToString();
                }
            }
            //下标对换
            string[,] arrSwap = new string[intColumns, intRows];
            for (int m = 0; m < intColumns; m++)
            {
                for (int n = 0; n < intRows; n++)
                {
                    arrSwap[m, n] = arrayData[n, m];
                }
            }
            DataTable dt = new DataTable();
            //添加列
            for (int k = 0; k < intRows; k++)
            {
                dt.Columns.Add(
                        new DataColumn(arrSwap[0, k])
                    );
            }
            //添加行
            for (int r = 1; r < intColumns; r++)
            {
                DataRow dr = dt.NewRow();
                for (int c = 0; c < intRows; c++)
                {
                    dr[c] = arrSwap[r, c].ToString();
                }
                dt.Rows.Add(dr);
            }
            //添加行头
            DataColumn ColRowHead = new DataColumn(tableData.Columns[0].ColumnName);
            dt.Columns.Add(ColRowHead);
            dt.Columns[ColRowHead.ColumnName].SetOrdinal(0);
            for (int i = 0; i < intColumns - 1; i++)
            {
                dt.Rows[i][ColRowHead.ColumnName] = tableData.Columns[i + 1].ColumnName;
            }
            return dt;
        }

 

ETL 工具 - KETTLE 教程 实例实战 4---- 转换(值映射、列转行,增加常量、增加序列等)

ETL 工具 - KETTLE 教程 实例实战 4---- 转换(值映射、列转行,增加常量、增加序列等)

 

接着上一讲,讲完了常用的输入、输出控件后,这一节我们来讲下常用的转换控件,如下图:

 

 

 

3、转换

3.1 值映射:将一个数据流的内容,转换成另外的数据流,并输出。作用如同 sql 语句中的 decode 函数。

 

 

 

   此处用到三个控件,表输入、表输出(可以参考前面的内容)和值映射。三个控件用 hop 线进行连接。

   双击值映射,如上图所示配置好相应的源值和目标值,通过连线从 A 表连接到 B 表。运行结果如下:

 

 

 3.2 列转行:将二维数据流的其中 1 列数据,转换为行(也就是列转换为行的表头),在根据关键字段进行展示。

   此处用到两个控件,表输入(可以参考前面的内容)和列转行。两个控件用 hop 线进行连接。

   双击列转行,如上图所示配置好关键字段、构成分组的字段和目标字段。运行结果如上图步骤 4。

 

 

 

 3.3 剪切字符串:如同各种数据库的 substr 函数,用处不大可以忽略。

 

 

  3.4 去除重复记录:根据某个字段进行剔重,类似于 sql 语句中的 distinct

 

 

 

  此处用到两个控件,表输入(可以参考前面的内容)和去除重复记录。两个控件用 hop 线进行连接。

   表输入需要先按照比较字段进行排序,如上图所示配置好计数器字段和用来比较的字段。运行结果如上图步骤 3

 

 

  3.5 增加常量、增加序列:增加常量和增加数据库序列

 

 

 

 如上图所示,配置好常量值和序列值,即可生成

 

  3.6 字段选择:将上一步骤数据流中的数据进行格式转换(主要用于时间的转换)

 

 

 

  此处用到两个控件,表输入(可以参考前面的内容)和字段选择。两个控件用 hop 线进行连接。

   表输入中存在包含时间的字段(可以看到不是按照标注的日期时间格式输出),如下左图,选择 cjsj 时间进行转换候。运行结果如下右图:

 

 

 

  3.7 字符串操作:如同各种数据库的各种字符串处理函数,用处不大可以忽略

  3.8 字符串替换:如同各种数据库的 replace 函数,用处不大可以忽略

  3.9 拆分字段:如同各种数据库的 split 函数,将字段按照分隔符拆分成多个字段

 

 

   此处用到两个控件,表输入(可以参考前面的内容)和拆分字段。两个控件用 hop 线进行连接。

   拆分字段选择需要拆分的字段、分隔符、和拆分后的字段,点击运行。运行结果如下图:

 

 

接着上一讲,讲完了常用的转换控件后,接下来我们来讲下常用的应用控件,如下图:

 

 

4、转换

4.1 写日志 可以通过写日志,将上一个数据流中日志信息打印出来,可以设置具体的日志级别

 

 如上图所示,配置好日志头信息,设置好日志级别,打印相应的日志

 

往期文章:

  • ETL 工具 - KETTLE 教程实例实战 3---- 转换

 

欢迎关注公众号,回复 “教程” 获取程序源代码,获取例子源码,扫描下方二维码加关注

 

Hive-explode[列转行]关键字使用

Hive-explode[列转行]关键字使用

本文讨论 Hive explode 关键字使用, 并使用一个简单案例来验证结果.

Hive 支持 array 和 map 类型, 但是如何统计 array 或 map 里的值, 一直没有找到好的方法. Pig 有行转列关键字 flatten. 查阅了很多 Hive 资料, 找到了 explode 关键字. 谨以此例来验证 Hive explode 功能.

hive> create table if not exists explode_array
> (
>     userId string,
>     userName string,
>     tags   array<string>
> ) 
> ROW FORMAT DELIMITED 
> FIELDS TERMINATED BY ''\t''
> COLLECTION ITEMS TERMINATED BY '','';
OK
Time taken: 0.942 seconds

数据样例:

00001	zhzhenqin	80,90
00002	hello	java, 女	
00003	world	java,python,90

查询:

hive> select * from explode_array limit 10;                                                    
OK
00001	zhzhenqin	["80","90"]
00002	hello	["java"," 女"]
00003	world	["java","python","90"]
Time taken: 0.041 seconds, Fetched: 3 row(s)

使用 explode 查询:

hive> select userId,userName,tagId from explode_array lateral view explode(tags) tags as tagId;
Total jobs = 1
... 省略部分日志
Total MapReduce CPU Time Spent: 0 msec
OK
00001	zhzhenqin	80
00001	zhzhenqin	90
00002	hello	java
00002	hello	 女
00003	world	java
00003	world	python
00003	world	90
Time taken: 20.104 seconds, Fetched: 7 row(s)

二次嵌套查询, 并统计:

hive> select user_tag.tagId, count(*) as count from (select userId,userName,tagId from explode_array lateral view explode(tags) tags as tagId) as user_tag group by user_tag.tagId order by count DESC;
Total jobs = 2
... 省略日志
Total MapReduce CPU Time Spent: 0 msec
OK
java	2
90	2
python	1
80	1
 女	1
Time taken: 39.994 seconds, Fetched: 5 row(s)

该例子是使用 array 类型, 我们的用户和标签在 Hive 存储的是 map 类型, Map 的 key 为 tagid, value 为 weight. explode 也是支持 map 类型的.

explode 在转 array 时, 输出一列; 转 map 时, 是输出2列, key 和 value 当做 2列输出.

下面演示 Map 类型的 explode 用法:

建表语句, 以及导入的数据
create table if not exists explode_map
(
    userId string,
    userName string,
    tags   map<string, int>
) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ''\t''
COLLECTION ITEMS TERMINATED BY '',''
MAP KEYS  TERMINATED BY '':'';

数据
00001	zhzhenqin	80:1,90:2
00002	hello	java:10,女:2
00003	world	java:1,python:3,90:1

查询验证:

hive> select * from explode_map;
OK
00001	zhzhenqin	{"80":1,"90":2}
00002	hello	{"java":10,"女":2}
00003	world	{"java":1,"python":3,"90":1}
Time taken: 0.04 seconds, Fetched: 3 row(s)

使用 explode 关键字查询:

hive>select userId,userName,tagId,weight from explode_map lateral view explode(tags) tags as tagId, weight;
00001	zhzhenqin	80	1
00001	zhzhenqin	90	2
00002	hello	java	10
00002	hello	女	2
00003	world	java	1
00003	world	python	3
00003	world	90	1

内嵌查询及统计:

hive> select user_tag.tagId, count(*) as count from (select userId,userName,tagId,weight from explode_map lateral view explode(tags) tags as tagId, weight) as user_tag group by user_tag.tagId order by count DESC;
java	2
90	2
女	1
python	1
80	1

hive操作(行转列,列转行)

hive操作(行转列,列转行)

一、行转列

1.相关函数说明

CONCAT(string A/col, string B/col):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

2.数据准备

孙悟空    白羊座    A
大海    射手座    A
宋宋    白羊座    B
猪八戒    白羊座    A
凤姐    射手座    A

3.需求

把星座和血型一样的人归类到一起。结果如下:

射手座,A            大海|凤姐

白羊座,A            孙悟空|猪八戒

白羊座,B            宋宋

4.创建表并导入数据

create table person_info(
    name string,//姓名
    constellation string,//星座
    blood_type string)//血型
    row format delimited fields terminated by "\t";

load data local inpath "/home/hadoop/file/ person_info" into table person_info;//导入数据到数据库

5.

select
    > 
    >     t1.base,
    > 
    >     concat_ws(''|'', collect_set(t1.name)) name//拼接名字
    > 
    > from
    > 
    >     (select
    > 
    >         name,
    > 
    >         concat(constellation, ",", blood_type) base//拼接星座血型
    > 
    >     from
    > 
    >         person_info) t1//设置表别名
    > 
    > group by
    > 
    >     t1.base;

 

6.结果截图

二、列转行

1.函数说明

EXPLODE(col)hive列中复杂的array或者map结构拆分成多行。

LATERAL VIEW

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解释:用于和split, explodeUDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

2.数据准备

《疑犯追踪》    悬疑,动作,科幻,剧情
《Lie to me》    悬疑,警匪,动作,心理,剧情
《战狼2》    战争,动作,灾难

3.需求

将电影分类中的数组数据展开。结果如下:

《疑犯追踪》      悬疑

《疑犯追踪》      动作

《疑犯追踪》      科幻

《疑犯追踪》      剧情

Lie to me》   悬疑

Lie to me》   警匪

Lie to me》   动作

Lie to me》   心理

Lie to me》   剧情

《战狼2》        战争

《战狼2》        动作

《战狼2》        灾难

4.创建数据库并且导入数据

create table movie_info(
    movie string,
    category array<string>)
    row format delimited fields terminated by "\t" 
    collection items terminated by ",";‘
 load data local inpath "/home/hadoop/file/movie_info" into table movie_info;//讲数据导入到数据库

5.按需求查询

select
    > 
    >     movie,
    > 
    >     category_name
    > 
    > from 
    > 
    >     movie_info lateral view explode(category) table_tmp as category_name;

 6.显示结果

 

今天关于oracle 遍历查询,列转行oracle 查询结果列转行的分享就到这里,希望大家有所收获,若想了解更多关于C# DataTable 行转列 列转行 同时转换、ETL 工具 - KETTLE 教程 实例实战 4---- 转换(值映射、列转行,增加常量、增加序列等)、Hive-explode[列转行]关键字使用、hive操作(行转列,列转行)等相关知识,可以在本站进行查询。

本文标签: