1. 程式人生 > >sqlserver中,如何把一列中的多行資料在一行顯示

sqlserver中,如何把一列中的多行資料在一行顯示

SQL code問題描述:
無論是在sql 2000,還是在 sql 2005 中,都沒有提供字串的聚合函式,
  所以,當我們在處理下列要求時,會比較麻煩:
有表tb, 如下:
id    value
----- ------
1     aa
1     bb
2     aaa
2     bbb
2     ccc
需要得到結果:
id     values
------ -----------
1      aa,bb
2      aaa,bbb,ccc
即, group by id, 求 value 的和(字串相加)

1. 舊的解決方法

-- 1. 建立處理函式
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
    DECLARE @r varchar(8000)
    SET @r = ''
    SELECT @r = @r + ',' + value
    FROM tb
    WHERE 
[email protected]
RETURN STUFF(@r, 1, 1, '') END GO -- 呼叫函式 SELECt id, values=dbo.f_str(id) FROM tb GROUP BY id -- 2. 新的解決方法 -- 示例資料 DECLARE @t TABLE(id int, value varchar(10)) INSERT @t SELECT 1, 'aa' UNION ALL SELECT 1, 'bb' UNION ALL SELECT 2, 'aaa' UNION ALL SELECT 2, 'bbb' UNION ALL SELECT 2, 'ccc' -- 查詢處理 SELECT * FROM( SELECT DISTINCT id FROM @t )A OUTER APPLY( SELECT [values]= STUFF(REPLACE(REPLACE( ( SELECT value FROM @t N WHERE id = A.id FOR XML AUTO ), '<N value="', ','), '"/>', ''), 1, 1, '') )N /*--結果 id values ----------- ---------------- 1 aa,bb 2 aaa,bbb,ccc (2 行受影響) --*/ --各種字串分函式 --3.3.1 使用遊標法進行字串合併處理的示例。 --處理的資料 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 --合併處理 --定義結果集表變數 DECLARE @t TABLE(col1 varchar(10),col2 varchar(100)) --定義遊標並進行合併處理 DECLARE tb CURSOR LOCAL FOR SELECT col1,col2 FROM tb ORDER BY col1,col2 DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100) OPEN tb FETCH tb INTO @col1,@col2 SELECT @
[email protected]
,@s='' WHILE @@FETCH_STATUS=0 BEGIN IF @[email protected]_old SELECT @[email protected]+','+CAST(@col2 as varchar) ELSE BEGIN INSERT @t VALUES(@col1_old,STUFF(@s,1,1,'')) SELECT @s=','+CAST(@col2 as varchar),@[email protected] END FETCH tb INTO @col1,@col2 END INSERT @t VALUES(@col1_old,STUFF(@s,1,1,'')) CLOSE tb DEALLOCATE tb --顯示結果並刪除測試資料 SELECT * FROM @t DROP TABLE tb /*--結果 col1 col2 ---------- ----------- a 1,2 b 1,2,3 --*/ GO /*==============================================*/ --3.3.2 使用使用者定義函式,配合SELECT處理完成字串合併處理的示例 --處理的資料 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 GO --合併處理函式 CREATE FUNCTION dbo.f_str(@col1 varchar(10)) RETURNS varchar(100) AS BEGIN DECLARE @re varchar(100) SET @re='' SELECT @
[email protected]
+','+CAST(col2 as varchar) FROM tb WHERE [email protected] RETURN(STUFF(@re,1,1,'')) END GO --呼叫函式 SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1 --刪除測試 DROP TABLE tb DROP FUNCTION f_str /*--結果 col1 col2 ---------- ----------- a 1,2 b 1,2,3 --*/ GO /*==============================================*/ --3.3.3 使用臨時表實現字串合併處理的示例 --處理的資料 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 --合併處理 SELECT col1,col2=CAST(col2 as varchar(100)) INTO #t FROM tb ORDER BY col1,col2 DECLARE @col1 varchar(10),@col2 varchar(100) UPDATE #t SET @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END, @col1=col1, [email protected] SELECT * FROM #t /*--更新處理後的臨時表 col1 col2 ---------- ------------- a 1 a 1,2 b 1 b 1,2 b 1,2,3 --*/ --得到最終結果 SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1 /*--結果 col1 col2 ---------- ----------- a 1,2 b 1,2,3 --*/ --刪除測試 DROP TABLE tb,#t GO /*==============================================*/ --3.3.4.1 每組 <=2 條記錄的合併 --處理的資料 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'c',3 --合併處理 SELECT col1, col2=CAST(MIN(col2) as varchar) +CASE WHEN COUNT(*)=1 THEN '' ELSE ','+CAST(MAX(col2) as varchar) END FROM tb GROUP BY col1 DROP TABLE tb /*--結果 col1 col2 ---------- ---------- a 1,2 b 1,2 c 3 --*/ --3.3.4.2 每組 <=3 條記錄的合併 --處理的資料 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 UNION ALL SELECT 'c',3 --合併處理 SELECT col1, col2=CAST(MIN(col2) as varchar) +CASE WHEN COUNT(*)=3 THEN ',' +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar) ELSE '' END +CASE WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar) ELSE '' END FROM tb a GROUP BY col1 DROP TABLE tb /*--結果 col1 col2 ---------- ------------ a 1,2 b 1,2,3 c 3 --*/ GO if not object_id('A') is null drop table A Go Create table A([id] int,[cname] nvarchar(2)) Insert A select 1,N'張三' union all select 2,N'李四' union all select 3,N'王五' union all select 4,N'蔡六' Go --> --> if not object_id('B') is null drop table B Go Create table B([id] int,[cname] nvarchar(5)) Insert B select 1,N'1,2,3' union all select 2,N'3,4' Go create function F_str(@cname nvarchar(100)) returns nvarchar(100) as begin select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','[email protected]+',')>0 return @cname end go select [id],dbo.F_str([cname])[cname] from B id cname ----------- ---------------------------------------------------------------------------------------------------- 1 張三,李四,王五 2 王五,蔡六 (2 個資料列受到影響)

相關推薦

ORACLE:資料拼成字串

上篇文章寫的是在ibatis中,需要返回一個字串,卻返回了多行資料,結果出現了錯誤。 其實,我想做的是:   查詢表中的一個欄位,返回了多行,就把這麼多行的資料都拼成一個字串。 例:   id  name        1   aa        2   bb       

sqlserver如何資料一行顯示

SQL code問題描述: 無論是在sql 2000,還是在 sql 2005 中,都沒有提供字串的聚合函式, 所以,當我們在處理下列要求時,會比較麻煩: 有表tb, 如下: id value ----- ------ 1 aa 1 bb 2

oracle語句如何的值合併為一個值用逗號隔開

在Oracle中則可以使用wm_concat 或 ListAgg 01.CREATE TABLE MyTest(xType NUMBER,City nvarchar2(200)); 02./ 03. 04.INSERT INTO MyTest(xType,Cit

oracle一個表指定的欄位資料更新到另外張表裡面

一、建立表結構 create table test1( id varchar2(10) , val varchar2(20), name varchar2(20)); create table test2( id varchar2(10), val varchar2(20) ,

去掉某重複的值(sql 語句)

在一個表中c列有重複值,a為主鍵,如何select a,b列同時排除c列有重複的? SELECT a,c,b FROM table WHERE a IN (SELECT MIN(a) AS  a FROM table GROUP BY c )

spark dataframe 分隔分隔(scala)

關於spark dataframe ,這裡介紹三種實用中實現可能比較麻煩的操作,首先上原始資料集 mRecord:一,合併content列,將name相同的content合併到一行,用逗號隔開: mRecord.createOrReplaceTempView("

oracle

select t.rank, t.Name from t_menu_item t;     10 CLARK     10 KING     10 MILLER     20 ADAMS     20 FORD     20 JONES     20 SCOTT     2

hive udtf 輸入返回

create json clu spark beeline tin tca org.json 1.0 之前說到了hive udf,見https://blog.csdn.net/liu82327114/article/details/80670415 UDTF(User-De

關於SQL Server將內容拼接成一行的問題討論

示例 昨天遇到一個SQL Server的問題:需要寫一個儲存過程來處理幾個表中的資料,最後問題出在我想將一個表的一個列的多行內容拼接成一行,比如表中有兩列資料 : 類別 名稱 AAA 企業1

SQL 合併方法

T_SQL 將一列多行資料合併為一行 SQL Server在進行資料遷移和報表處理的時候會遇到將一列多行資料拼接為一個字串的情況,為了處理這個問題,在網上找了一些相關的資料,提供兩種方法,供遇到類似問題的朋友們參考,也藉此加深自己的印象。 Table:SC St

SQL Server將內容拼接成一行或一個字串的問題

昨天遇到一個SQL Server的問題:需要寫一個儲存過程來處理幾個表中的資料,最後問題出在我想將一個表的一個列的多行內容拼接成一行 比如表中有兩列資料 : ep_classes  ep_name AAA         企業1 AAA         企業2

mysql 行列互換互換資料陣列資料

1. 列變行,比較難,需要使用儲存過程,呼叫動態sql,使用mysql的系統表information_schema.`COLUMNS`。 2.行變列,比較簡單。 2.1 sum if SELECT     cname AS "姓名",     SUM(IF(cource=

關於SQL Server將內容拼接成一行

示例 需要寫一個儲存過程來處理幾個表中的資料,最後問題出在我想將一個表的一個列的多行內容拼接成一行,比如表中有兩列資料 : 類別 名稱 AAA 企業1 AAA 企業2 AAA 企業3 BBB 企業4 BBB 企業5 我想把這個表變成如下格式:

oracle變成一行/合併成一行/合併成/合併

和mysql對比著看:http://blog.csdn.net/rainyspring4540/article/details/50231435 這裡是oracle10g的環境 資料庫結構如下: 如果我想將相同名字的成績顯示在同一行,有2中基本展示: 第一種展示(顯示在同

pandas資料統計某或者某資料元素的個數

在《pandas資料框,統計某列資料與其他檔案對應關係的個數》之後,我發覺簡單版的元素個數統計問題沒有說清楚,就在這裡介紹兩個統計pandas資料框裡面列、行元素個數的方法:程式碼如下:import pandas as pd import numpy as np df =

Oracle語句的值合併為一個值用逗號隔開

所有版本的oracle都可以使用wm_concat()函式  例:select wm_concat(name) as name from user; 但如果是oracle11g,使用listagg() within group()函式  例:select listag

mysql資料更新到另(涉及到張表的資料

假設有三張表A,B,C現在要把C表中的一列資料更新到A表中,而A和C之間還有張B表。假設要把C表中的id更新到A表中,那麼就可以這樣寫:UPDATE A AINNER JOIN B ON A.xxx = B.xxxINNER JOIN C ON B.xxx= C.xxxSET

sql 如何同時更改

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

Pandas: 如何將的文本拆分為? | Python

gid scene pmo lua ioe solid gige ble app Pandas: 如何將一列中的文本拆分為多行? 在數據處理過程中,經常會遇到以下類型的數據: 在同一列中,本該分別填入多行中的數據,被填在一行裏了,然而在分析的時候,需要拆分成為多

題目描述 在一個二維數組(每個維數組的長度相同)一行都按照從左到右遞增的順序排序一列都按照從上到下遞增的順序排序。請完成一個函數輸入這樣的一個二維數組和一個整數判斷數組是否含有該整數。

這樣的 -i 一個 整數 描述 輸入 遞增 lse i+1 題目描述 在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 1