1. 程式人生 > >ORACLE中行列轉換的問題解決

ORACLE中行列轉換的問題解決

在論壇上看到一個問題,自己以前也遇到過,像是一個老友,又熟悉又陌生,內心愧疚,趕緊去實際驗證,然後記錄在這裡給自己提個醒。

首先建立兩張表A,B,並插入資料,

create table A (
ID number(4),
NAME varchar2(10));
comment on column A.ID is '學號';

comment on column A.NAME is '姓名';

insert into A (ID,NAME) values ('1','張三');
insert into A (ID,NAME) values ('2','李四');
insert into A (ID,NAME) values ('3','王五');



create table B (
XUEH VARCHAR2(10),
SUBJECT varchar2(10));
comment on column B.XUEH is '學號';

comment on column B.SUBJECT is '學科';

insert into B (XUEH,SUBJECT) values ('1,2','語文');
insert into B (XUEH,SUBJECT) values ('2,3','數學');
insert into B (XUEH,SUBJECT) values ('1,2,3','物理');
insert into B (XUEH,SUBJECT) values ('1,3','英語');
insert into B (XUEH,SUBJECT) values ('1','生物');



目標要實現以下的結果:

XUEH   NAME            SUBJECT
1,2        張三,李四           語文
2,3        李四,王五           數學
1,2,3     張三,李四,王五   物理
1,3        張三,王五           英語

1           張三                   生物

實現的sql語句:

select XUEH,(select wm_concat(name) from A where instr(XUEH,id)>0) as name,subject from B


解釋:wm_concat函式可以把列值以","號分隔起來,並顯示成一行,例如:select wm_concat(name) from A;我們得到張三,李四,王五的一行資料;instr(XUEH,id)>0這個意思是判斷XUEH欄位值是否包含ID欄位,大於0表示存在,這裡順便淺顯介紹下instr()函式:

(1)instr( string1, string2 ) / instr(源字串, 目標字串),string2在string1中查詢,舉例說明

select A.ID,B.XUEH from A,B where instr(B.XUEH,A.id)>0;


(2)instr( string1,string2,start_position,nth_appearance) / instr(源字串, 目標字串, 起始位置, 匹配序號),string2在string1中查詢,是從start_position給出的數值(即:位置)開始在string1檢索,檢索第nth_appearance(幾)次出現string2,舉例說明

select A.ID,B.XUEH ,instr(B.XUEH,A.id,1,1) AS place from A,B----其中XUEH內的值是個字串所以逗號也佔一位


例如我們按課程來查都有誰上課:

select subject,wm_concat(name) name from A,B group by subject


思考問題:如果XUEH欄位中有11,12,111,222,33,333...這樣的數值以上的寫法不能滿足,又該怎麼做呢?

相關推薦

ORACLE行列轉換的問題解決

在論壇上看到一個問題,自己以前也遇到過,像是一個老友,又熟悉又陌生,內心愧疚,趕緊去實際驗證,然後記錄在這裡給自己提個醒。首先建立兩張表A,B,並插入資料,create table A (ID number(4),NAME varchar2(10));comment on c

Oracle轉換函數

格式 select 不用 oracle 功能 日期 rom 字符 存在 Oracle中的轉換函數有三個,分別為to_char(),to_date(),to_number() 1、to_char()的用法 格式化當前的日期時間 select sysdate,to_char(s

Oracle行列轉換

列轉行 原理: 內建函式 LISTAGG 實現: with tmp as ( select 1 id,'name1' name from dual union all select 2 id,'name2' name from dual uni

MySQL行列轉換的SQL技巧 • cenalulu's Tech Blog

詳細介紹MySQL中用SQL實現行列轉換的技巧 行列轉換常見場景 由於很多業務表因為歷史原因或者效能原因,都使用了違反第一正規化的設計模式。即同一個列中儲存了多個屬性值(具體結構見下表)。 這種模式下,應用常常需要將這個列依據分隔符進行分割,並得到列轉行的結果。 表資料:

pandas行列轉換

In [31]: import pandas as pd ...: import numpy as np ...: df = pd.DataFrame(np.arange(8).reshape(2,4),index=['AA','BB'],columns= ...: [['two','

SQL Server行列轉換 Pivot UnPivot

PIVOT用於將列值旋轉為列名(即行轉列),在SQL Server 2000可以用聚合函式配合CASE語句實現 PIVOT的一般語法是:PIVOT(聚合函式(列) FOR 列 in (…) )AS P 完整語法: table_source PIVOT( 聚合函式(value_column) FOR piv

SQL Server 2005 行列轉換(Pivot 和 UNPivot的使用)

針對sql2005  系統提供兩個新的關鍵字 PIVOT 和UNPIVOT可用來作此類操作.語法規則<pivot_clause> ::=        ( aggregate_function ( value_column )         FOR pivot_

使用type型別和儲存過程來完成oracle行列轉換

  create or replace type obj_table1 as object( id varchar2(3), name varchar2(10) ); create or replace type tbl_table1 as table of obj_ta

ORACLE 字串轉換為陣列的函式方法

CREATE OR REPLACE TYPE splitArray AS TABLE OF VARCHAR2(2048); --------字串拆分函式 CREATE OR REPLACE FUNCTION fu_split_Array (      str IN VARCHAR2,--輸入的字串    

Java與Oracle日期轉換

今天是第一天寫部落格,良好的習慣始於今日,以後每天會寫點東西,可能沒有多大的篇幅。零零散散的,哪怕當做隨筆也好,堅持不懈的話,估計也會有所進步,最不濟,就當做筆記,忘記的東西也能找到。 Java的日期轉換問題,遇到了很多次,總是忘記。現記錄在此: //Date型別轉換成S

Informix的serial在oracle如何轉換

Informix的serial變數型別是一種自增資料型別。在create table時將欄位定義為serial型別,就可以實現變數值的自動增長,使用起來非常方便。 Oracle中實現serial: 只需要建立一個sequence變數和一個基於目標資料庫的trigger(觸

MySql和Oracle行列轉換筆記

建表先: DROP TABLE IF EXISTS `temp`; CREATE TABLE `temp` ( `year` varchar(10) DEFAULT NULL, `month` varchar(10) DEFAULT NULL, `amount` float(6,2)

[Oracle]行列轉換(行合並與拆分)

csdn employee .net title case color trac 數據轉換 con 使用wmsys.wm_concat 實現行合並在 Oracle 中, 將某一個欄位的多行數據轉換成使用逗號風格的一行顯示。能夠使用函數 wmsys.wm_concat

oracle使用impdp數據泵導入數據提示“ORA-31684:對象類型已經存在”錯誤的解決

fun 創建用戶 spa ide pos 錯誤 markdown ber dmp 轉載請註明出處:http://blog.csdn.net/dongdong9223/article/details/47448751 本文出自【我是幹勾魚的博客

SQLPIVOT 行列轉換

tor 子句 輸入 ble ont 運算符 之間 忽略 sql語句 本文導讀:T-SQL語句中,Pivot運算符用於在列和行之間對數據進行旋轉或透視轉換,PIVOT命令可以實現數據表的列轉行,同時執行聚合運算,UNPIVOT則與其相反,實現數據的行轉列。 PIVOT通過將

怎麽解決ORACLE CHAR類型的索引問題

添加 關聯查詢 系統 pre 破壞 補全 如果 關聯 acl 在很多場景中,都有如下情況 trim(a.colunm1) = trim(b.colunm2) 應該怎麽優化呢? 用到 TRIM 的很多原因是某些系統為了提高查詢效率,不使用 ORACLE 的特有的,優秀的

hibernate在Oracle插入數據,默認字段被設置為null的問題解決

insert語句 span blog 數據庫 添加 *** .cn gpo ber 參考內容: http://blog.sina.cn/dpool/blog/s/blog_90629d5301014a5w.html 在數據庫中一個字段的默認值為1,但是在插入數據後,本來該字

oracle 行列轉換 列名數字

雙引號 oracle The 分享 -m key com pri 時間 oracle 行列轉換列名如果是數字,用雙引號包住 如下: -- 建表 create table workinfo(wid integer primary key,sid integer ,CO

Oracle發生表加鎖、死鎖的原因,檢視,與解決方法

一.表加鎖、死鎖出現的現象 1.對資料庫操作update,insert,delete時候,資料庫無法更新,操作等待時長,操作結果不發生改變 2.在程式中,底層(資料訪問層)操作時候,不成功,資料庫連線超時,無法操作,或者操作等待時長等現象 【加鎖的原理】:比如一個操作在進行修改一表,它

Oracle時間日期格式轉換及常用日期函式

我的第一篇部落格,記錄學習,分享生活。 Oracle時間日期格式轉換: 主要有兩種格式,一種為日期格式date,一種為字元格式char。 查詢當前日期: select sysdate from dual; 將日期轉化為字元格式,可以對日期進行一些操作 --顯示所有僱員的姓名和加