1. 程式人生 > >SQL中合併多行記錄的方法總彙

SQL中合併多行記錄的方法總彙

-- =============================================================================
--
 Title: 在SQL中分類合併資料行
--
 Author: dobear        Mail(MSN): [email protected]
--
 Environment: Vista + SQL2005
--
 Date: 2008-04-22
--
 =============================================================================

--1. 建立表,新增測試資料
CREATE
TABLE tb(id int[value]varchar(10))
INSERT tb SELECT1'aa'
UNIONALLSELECT1'bb'
UNIONALLSELECT2'aaa'
UNIONALLSELECT2'bbb'
UNIONALLSELECT2'ccc'

--SELECT * FROM tb
/*
id          value
----------- ----------
1           aa
1           bb
2           aaa
2           bbb
2           ccc

(5 row(s) affected)
*/



--
2 在SQL2000只能用自定義函式實現
--
--2.1 建立合併函式fn_strSum,根據id合併value值
GO
CREATEFUNCTION dbo.fn_strSum(@idint)
RETURNSvarchar(8000)
AS
BEGIN
    
DECLARE@valuesvarchar(8000)
    
SET@values=''
    
SELECT@values=@values+','+ value FROM tb WHERE id=@id
    
RETURNSTUFF(@values11'')
END
GO

-- 呼叫函式
SELECT id, VALUE = dbo.fn_strSum(id) 
FROM tb GROUPBY id
DROPFUNCTION dbo.fn_strSum

----2.2 建立合併函式fn_strSum2,根據id合併value值
GO
CREATEFUNCTION dbo.fn_strSum2(@idint)
RETURNSvarchar(8000)
AS
BEGIN
    
DECLARE@valuesvarchar(8000)    
    
SELECT@values=isnull(@values+','''+ value FROM tb WHERE id=@id
    
RETURN@values
END
GO

-- 呼叫函式
SELECT id, VALUE = dbo.fn_strSum2(id) FROM tb GROUPBY id
DROPFUNCTION dbo.fn_strSum2


--3 在SQL2005中的新解法
--
--3.1 使用OUTER APPLY
SELECT* 
FROM (SELECTDISTINCT id FROM tb) A OUTER APPLY(
        
SELECT[values]=STUFF(REPLACE(REPLACE(
            (
                
SELECT value FROM tb N
                
WHERE id = A.id
                
FOR XML AUTO
            ), 
'<N value="'','), '"/>'''), 11'')
)N

----3.2 使用XML
SELECT id, [values]=STUFF((SELECT','+[value]FROM tb t WHERE id=tb.id FOR XML PATH('')), 11'')
FROM tb
GROUPBY id

--4 刪除測試表tb
droptable tb

/*
id          values
----------- --------------------
1           aa,bb
2           aaa,bbb,ccc

(2 row(s) affected)
*/

 

相關推薦

SQL合併記錄方法總彙

-- =============================================================================-- Title: 在SQL中分類合併資料行-- Author: dobear        Mail(MSN): [email prote

SqlServer和Oracle從記錄(資料集)查詢結果並拼接成一個字串的SQL語句(縱表資料轉成拼接的文字)

使用情景: 例如:需要從學生成績表中,查詢分數大於95分的所有學生編號,用逗號分隔成一個字串。 準備測試資料: create table score (id int,score int) insert into score values(1,90) insert into

SQL將Oracle同一列的記錄拼接成一個字串

-- 原始資料 -- a 111 -- b 222 -- a 333 -- a 444 -- b 555 -- 最終結果 -- a 111*333*444 SELECT L4.L_TIME ,MAX(SUBSTR(L4.分組內容,2)) 最終欄位

sql 如何同時更改一列

sql如圖,我要把 pre_tel 列 都加上 010 或者其他區號,但是如何用同一條 sql 語句實現?sql 如何同時更改一列中的多行值

SQL中將某個表數據在一個字段顯示

ack 查詢 style 顯示 isp dex OS AC for 項目需求:將某個表中的多行數據在一個字段顯示,如下: 比如表A中有字段 ID,NAME, 表B中有字段ID,PID,DES, 表A,表B中的數據分別如下: ID NAME1 張三2 李四 ID PID DE

sql資料庫:根據某分隔符將一條記錄拆分為記錄

需要通過身份證號聯表查詢比對,可是房產登記的身份證可能不止一個,查詢的時候只能比對一個身份證號的 所以需要 根據某分隔符將一條記錄拆分為多行記錄 從網上找到一個例子 create table tb(id int,value varchar(30)) insert into

SQL中用insert into插入一行或記錄

INSERT INTO插入一行記錄:         INSERT INTO tablename values(v1,v2,...);  --這裡需包括所有列的值    若只向指定列插入值:         INSERT INTO tablename (column1,co

[Hive]用concat_w實現將記錄合併成一行

建表如下: # 建立商品與促銷活動的對映表 hive -e "set mapred.job.queue.name=pms; set hive.exec.reducers.max=32; set ma

css 內容垂直居中的方法

HTML程式碼: <div class="textList"> <p>為您提供世界級的包裝產品,我們完善的管理體系為您確保產品質量可靠穩定&l

mysql查詢結果合併成一個

SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND md.mimetype_id= 5 AND md.user_id=17: 利用函式:group_concat(

在dbgrid如何選中記錄(ctl與shift均可用)

在dbgrid中如何多行選中記錄(ctl與shift均可用),設定dbgrid的dgmultiselect為true,只有ctl好用而shift不好用,如何使shift也好用 Dbgrid原始碼:procedure TCustomDBGrid.KeyDown(var Key:&nbs

LaTex註釋方法

解決方法: 1. 單行註釋:直接加入%即可; 2. 多行註釋:使用\usepackage{verbatim}巨集包,然後在待註釋的部分上加入\begin{comment} ... \end{co

eclipse快速註釋的方法以及Myeclipse快捷

1.選中你要加註釋的區域,用ctrl+shift+C 會加上//註釋 2.先把你要註釋的東西選中,用shit+ctrl+/ 會加上/*    */註釋 3.要修改在eclispe中的命令的快捷鍵方式我們只需進入windows -> preference ->

LaTeX表格顯示的最簡單設定方法

這其實是一個很簡單的問題,但是這兩天發現我之前的解決方案太麻煩了。簡單介紹一下這種最簡單的方法: 之前設定多行顯示的時候,用類似於下面這種方法進行多行顯示: \begin{table} \newcommand{\tabincell}[2]{\begin{tabular}

SQL語句記錄同一欄位的值連線成一個字串顯示結果集(sql stuff)

SELECT STUFF('abcdef', 2, 3, 'ijklmn'); 結果:aijklmndf。 1. if object_id('[tb]') is not null drop table [tb] go create table [tb]([Inv] int

sql 分隔符字串轉換成表以及記錄列值轉換成字串

--1. 字串(分隔符分隔組成的字串)轉換成多行記錄的表 -- Function create FUNCTION [dbo].[fn_Split1]( @String nvarchar (max), @Delimiter nvarchar (10)

SQL 合併記錄 --GROUP_CONCAT 用法

例子:     表資料:(SELECT id,title FROM doc) id title2  aa2  cc3  dd…… 期望返回結果:"aa,cc,dd" 執行語句:SELECT GROUP_CONCAT(title) AS title FROM doc 期望返回

循環刪除DataTable.Row問題

datarow for datatable eight nbsp family let -- 永遠 在C#中,如果要刪除DataTable中的某一行,大約有以下幾種辦法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows

mysql查詢結果合並成一個(轉)

get asc 數據 利用 sel tor _id and ont SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND md.mimetype_id= 5 AND

過濾文件的空解決方法

linux方法1:基礎方法[[email protected] ~]# grep -v "^$" oldboy.txt[[email protected] ~]# sed ‘/^$/d‘ oldboy.txt[[email protected] ~]# awk ‘!/^$/‘ o