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