1. 程式人生 > >關於oracle多條記錄合併為一條記錄的方法

關於oracle多條記錄合併為一條記錄的方法

今天正還有同學問了一個問題,怎麼把兩條不同的記錄合併成一條記錄從資料庫裡面拿出來,oracle資料庫。
拿到之後首先想的是,分兩條sql語句去查,然後在程式裡做拼接。經過溝通發現,同學的需求不是這個樣子的,是要求一條sql語句獲取兩條記錄併合並他們,資料庫學的比較菜,上來就寫了一個很白痴的sql

select id,
(select col from table where id=t.id and flag=1)colA,
(select col from table where id=t.id and flag=2)colA
from table t where id='123'

後續問題出來了,同學表裡面並沒有flag,後來想到了ROWNUM,可以通過排序後,拿到前兩條記錄,在做上面的查詢,但是同學的table並不是單一的一張表,是又多表聯合得到的,而且定位一條記錄時,要通過幾個條件才可以。後來在網上查詢了一下,多出提到的是wmsys.wm_concat函式,但是並不符合要求,wmsys.wm_concat是將多列合併到一塊,而我們需要的是分不同欄位顯示。最後發現了一篇帖子

http://bbs.csdn.net/topics/390691977
大體思路是,先對分組對組內編號,在對組內要合併的行做操作。這裡用到了max(decode(colnum,1,col2,null));
分組,組內編號

select col1,col2,row_number()over(partition by col1 order by col2)colnum from COL_TO_ROW

over: 在什麼條件之上。
partition by e.deptno: 按部門編號劃分(分割槽)。
order by e.sal desc: 按工資從高到低排序(使用rank()/dense_rank() 時,必須要帶order by否則非法)
rank()/dense_rank()/row_number: 分級
整個語句的意思就是:選擇col1,col2,並且按照col1的值進行分組,組內按照col2的值排列,在此基礎上進行編號。
那麼rank()和dense_rank()有什麼區別呢?
rank(): 跳躍排序,如果有兩個第一級時,接下來就是第三級。
dense_rank(): 連續排序,如果有兩個第一級時,接下來仍然是第二級。
row_number():從1-n,忽略重複記錄

decode函式含義解釋:
decode(條件,值1,返回值1,值2,返回值2,...值n,返回值n,預設值)

該函式的含義如下:
IF 條件=值1 THEN
    RETURN(翻譯值1)
ELSIF 條件=值2 THEN
    RETURN(翻譯值2)
    ......
ELSIF 條件=值n THEN
    RETURN(翻譯值n)
ELSE
    RETURN(預設值)
END IF
decode(欄位或欄位的運算,值1,值2,值3

因為在使用group by 時,有一個規則需要遵守,即出現在select列表中的欄位,如果沒有在組函式中,那麼必須出現在group by 子句中。(select中的欄位不可以單獨出現,必須出現在group語句中或者在組函式中。)所以這裡又在decode外面套了一層函式。
wmsys.wm_concat是將符合條件的列按照逗號分割將他們相加。

SQL> select id,wmsys.wm_concat(name) over (order by id) name from idtable;
 ID NAME
---------- --------------------------------------------------------------------------------
  10 ab,bc,cd
  10 ab,bc,cd
  10 ab,bc,cd
  20 ab,bc,cd,hi,ij,mn
  20 ab,bc,cd,hi,ij,mn
  20 ab,bc,cd,hi,ij,mn

上面兩個函式都要配合GROUP BY 使用。
order by 和groub by 同時出現時,order by 的欄位必須在group by 中有

相關推薦

關於oracle記錄合併記錄方法

今天正還有同學問了一個問題,怎麼把兩條不同的記錄合併成一條記錄從資料庫裡面拿出來,oracle資料庫。 拿到之後首先想的是,分兩條sql語句去查,然後在程式裡做拼接。經過溝通發現,同學的需求不是這個樣子的,是要求一條sql語句獲取兩條記錄併合並他們,資料庫學的

js對json資料處理,將同一省裡的資料合併資料

test:function(){    var arr =[        {pName:'內蒙古',pId:'1',cName:'內1',cId:'11'},        {pName:'內蒙古',pId:'1',cName:'內2',cId:'12'},       

mysql_把符合條件的某列的資料合併

select GROUP_CONCAT(xxx SEPARATOR ',') from table_name group by xxxGROUP_CONCAT()中的值為你要合併的資料的欄位名,預設預

ECharts 座標軸軸線,合併

一、問題 2條y軸,y軸的座標軸軸線axisLine太多,擾人視線,如圖 二、經過 剛開始用分割線(yAxis.splitLine)做出來的這個效果。 後期,改為兩條線合併為一條。 網上找一個沒有關於splitLine的設定,查詢ECharts,發現一

Mysql之一對查詢,如何將記錄合併記錄

資料庫環境:mysql5.6 需求描述(圖1): 最終期望的結果(圖2): 如上圖所示,現有兩張表cj_lottery_winning_record和cj_lottery_winning_user_info 兩者的關係是一對多。 現在進行連線查

oracle sql資料合併,資料量大,用逗號隔開

SELECTxmlagg(XMLPARSE (CONTENT TRANSLATE (unique_id USING CHAR_CS) || ',' WELLFORMED)).getclobval()FROMBIM_ELEMENTCODEWHEREpj_id = '0305'

sql中怎樣把同一張表中相同欄位的內容合併記錄(合併記錄的後面不加逗號)?

一、建立表 create table stuUnion (  sid int identity primary key,  cid int,  id varchar(500) ) 二、新增資料 insert into stuUnion select 1,'a' union

sqlserver 將一個欄位下的行語句合併資料

select 名稱 = ( stuff( (select ',' + CAST(欄位名AS VARCHAR) from 表名 where 條件 for xml path('')), 1, 1,

SQL中如何把查詢結果合併資料

SELECT TOP 1000 [diqu] ,[fuzeren] ,[yugong] FROM [lx].[dbo].[ls]   select diqu,fuzeren,stuff((select ','+yugong from ls whe

Kafka:ZK+Kafka+Spark Streaming集群環境搭建(二十五)Structured Streaming:同一個topic中包含組數據的個部分,按照key它們拼接記錄(以及遇到的問題)。

eas array 記錄 splay span ack timestamp b- each 需求: 目前kafka的topic上有一批數據,這些數據被分配到9個不同的partition中(就是發布時key:{m1,m2,m3,m4...m9},value:{records

oracle 一個表重複記錄只取的解決方法

A  表:  id     name 1      張三 2      李四 B    表:   id  為  A  表 主鍵 id    name 1     王五 1      小李 1     王八 2     趙四 2     李五

oracle記錄拼成字串

select listagg(t.weather_type,',') within GROUP(ORDER BY NULL) weather_type from CO_WEATHER_TYPE t where t.weather_id in (

Oracle刪除重複記錄只保留資料的幾種方法

1、查詢表中多餘的重複記錄,重複記錄是根據單個欄位(peopleId)來判斷 SELECT * FROM people WHERE peopleid IN ( SELECT peopleid FROM people GROUP BY peopleid

oracle 查詢當前記錄的上記錄或下記錄

上一條 select *   from cms_article a where id = (select c.p               from (select t.id, lag(t.id, 1, 0) over(order by t.sort) as p   

oracle 刪除重複記錄 只保留

在對資料庫進行操作過程中我們可能會遇到這種情況,表中的資料可能重複出現,使我們對資料庫的操作過程中帶來很多的不便,那麼怎麼刪除這些重複沒有用的資料呢?   重複資料刪除技術可以提供更大的備份容量,實現更長時間的資料保留,還能實現備份資料的持續驗證,提高資料恢復服務水平,

mysql 同樣內容的字段合並方法

tar man fse join ng- article amount mic lec 從兩個表中內聯取出的數據,當中category_name字段有同樣內容,想將具有同樣內容的字段進行合並,將amount字段進行加法運算,變成下表中的內容 SELECT

Oracle資料重複,只取

--方法一 select * from tb_supply where rowid=any(select max(rowid) from tb_supply group by phone_id) --方法二 select * from tb_supply where rowid in (selec

Oracle 刪除重複資料只留

查詢及刪除重複記錄的SQL語句 1、查詢表中多餘的重複記錄,重複記錄是根據單個欄位(Id)來判斷 select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1) 2、刪除

一對 語句只出現的問題

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-

ORACLE隨機從表中取資料作為函式返回值

需求是這樣的:有一張經緯度表,需要從中隨機取一條資料插入另一張表作為其中的兩個欄位。插入過程在儲存過程中,所以需要函式返回值為經緯度資料物件。 首先,生成返回值物件POINT_OBJECT,包括經度緯度。 --生成經緯度 CREATE OR REPLACE TYPE POINT_OBJECT AS OB