oracle 根据某一行的值转化成列?

假如:表结构如下:字段
name zfname date
甲 size1 2010-2-1
甲 size2 2010-2-1
乙 size1 2010-2-1
丙 size3 2010-2-1 。。。
我想要的效果是,根据 zfname 字段转列(这个字段有多少个不一样的值,就转多少列)
所以要的就是如下效果
name size1 size2 size3 ...(因为我的数据只有这三个,所以就转三列)
甲 1 1 0
乙 1 0 0
丙 0 0 1
也就说,转好后再统计 ,转的列名 就是zfname 字段 所存的数据
大家能否写个sql 语句给我啊 ,谢谢啊

第1个回答  2010-08-25
楼主这种 典型的行列转换问题。

Oracle 一般就通过 DECODE 或者 CASE WHEN 来处理。

SQL> CREATE TABLE TEST_YLX (
2 name VARCHAR2(2),
3 zfname VARCHAR2(6),
4 tdate DATE
5 );

Table created.

SQL>
SQL> INSERT INTO TEST_YLX VALUES ('A', 'size1', TO_DATE('2010-02-01', 'YYYY-MM-D
D') );

1 row created.

SQL> INSERT INTO TEST_YLX VALUES ('A', 'size2', TO_DATE('2010-02-01', 'YYYY-MM-D
D') );

1 row created.

SQL> INSERT INTO TEST_YLX VALUES ('B', 'size1', TO_DATE('2010-02-01', 'YYYY-MM-D
D') );

1 row created.

SQL> INSERT INTO TEST_YLX VALUES ('C', 'size3', TO_DATE('2010-02-01', 'YYYY-MM-D
D') );

1 row created.

SQL>
SQL> SELECT
2 name,
3 SUM ( DECODE(zfname, 'size1', 1, 0) ) AS size1,
4 SUM ( DECODE(zfname, 'size2', 1, 0) ) AS size2,
5 SUM ( CASE WHEN(zfname = 'size3') THEN 1
6 ELSE 0
7 END
8 ) AS size3
9 FROM
10 test_ylx
11 GROUP BY
12 name;

NAME SIZE1 SIZE2 SIZE3
---- ---------- ---------- ----------
A 1 1 0
B 1 0 0
C 0 0 1

SQL>

上面的例子中, size1 和 size2 是用 DECODE
size3 用 CASE WHEN

看具体情况需要,而使用。

========================================

唯一麻烦的是

这个SQL, 需要预先知道, size1 size2 size3 这些信息

如果表中新增加了 size4 , 需要修改 SQL 语句。
第2个回答  2010-08-25
典型的分类汇总

oracle 有个 decode(列传行)函数
第3个回答  2010-08-25
select name,sum(decode(zfname,'size1',1,0)) size1
,sum(decode(zfname,'size2',1,0)) size2
,sum(decode(zfname,'size3',1,0)) size3
from 表
group by name本回答被提问者采纳
第4个回答  2010-08-25
你知道有具体多少个zfname 数值,可以用一条语句,要不就要用存储过程了

oracle行转列
Oracle数据库中的行转列操作,通常指的是将多行数据转换成多列数据的展示形式。这种转换在数据分析、报表生成等场景中非常常见。为了实现这种转换,Oracle提供了一个非常强大的函数——PIVOT。PIVOT函数的作用:PIVOT函数的主要作用是根据指定的值将数据行转换为列。通过PIVOT函数,我们可以轻松地...

Oracle如何取出某一列的所有不重复值作为单独一列
这个是oracle的行变列转换 可以使用一个函数 sys_connect_by_path(column,<分隔符>)如 SELECT c.gysid, listagg(c.wzlbid,',') within GROUP (ORDER BY c.wzlbid) FROM wzgl_gys_zrwmfw c GROUP BY gysid 这几个方法都可以实现行转列,达到想要的效果。但当数据量比较大时却报ORA-01...

oracle将查询的结果值作为下一个查询的字段列。
1、声明动态游标 TYPE i_cursor_type IS REF CURSOR;2、声明游标变量 my_cursor i_cursor_type;3、使用游标 n_deptno:=20;dyn_select := 'select empno,ename from emp where deptno='||n_deptno;OPEN my_cursor FOR dyn_select;LOOP FETCH my_cursor INTO n_empno,v_ename;EXIT WHEN my_...

oracle 中将一行数据转换成两列
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、列数不固定(交叉表行列转置)这种是比较麻烦的一种,需...

oracle行转列函数
Oracle中的行转列函数主要是使用PIVOT来实现。这是一种SQL查询语句的功能,可将原本行格式的数据转化为列格式,有助于对数据的整理展示和对比分析。接下来我们将对Oracle的PIVOT函数进行详细解释。首先,Oracle数据库的PIVOT是行转列操作的一种非常有效的方法。当数据的展示和分析需求中需要针对某个或多个...

oracle行转列函数
Oracle数据库中,行转列功能可以通过REGEXP_SUBSTR函数实现。该函数能够从给定的字符串中按照特定模式提取子串,并将其转换为列的形式。下面是一个具体的例子:在SELECT语句中,我们使用了REGEXP_SUBSTR函数,传入参数'1',以及模式'[^,]+',这表示查找不包含','的任何字符。通过设定1作为第1个子串的...

oracle行转列(oracle中几种常用的行转列方法)
from scott.emp t group by t.job;方法二:Oracle 11g后引入PIVOT功能,简化行转列操作。但需确认数据库环境大于11g,并检查生产环境数据库版本,避免项目后期问题。SQL语句如下:with tmp_tab as(select t.job, t.deptno from scott.emp t )select * from tmp_tab t pivot(count(1) for ...

oracle 查询一条记录中的一列值的部分替换成另一列的值,怎么替换?
update A set A.description2= substr(A.description1,1,4)

oracle数据库关于把表的行变成列
61 数学 60 80 99 赵云 80 85 变成 语文 61 85 80 庞统 99 80 而且第一行为列名,不是表中的数据,这样的话 也就是第一个表下面三行的数据,变成第二个表下面两行的数据 这样还是可以的

sql怎样将行的值变为列,,,
接下来,关键的行转列的函数pivot出场了,通过这个函数我们把分数填充到转换的列语文、数学的列值。我们运行后,可以得到行转列的结果,如下图所示。通过以上几个步骤,我们就可以轻松的实现行列转换了。同样,我们如果要把列转换成行, 应该怎么做呢?同样我们可以采用unpivot函数轻松实现。

相似回答