關於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是將多列合併到一塊,而我們需要的是分不同欄位顯示。最後發現了一篇帖子
大體思路是,先對分組對組內編號,在對組內要合併的行做操作。這裡用到了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