a表
a列 b列
1 a
1 b
1 c
2 a
2 b
能否不用儲存過程 直接sql 得到
1 a,b,c
2 a,b,c
這樣的結果
可以的,用交叉方法
select a列,
max(case when b列='a' then 'a' else '' end) 列1,
max(case when b列='b' then 'b' else '' end) 列2,
max(case when b列='c' then 'c' else '' end) 列3
into temp_1219--插入臨時表
from a表
group by a列
這個是靜態的行列轉換,
如果是動態的行列裝換,也就是說你不知道表中a列的行數有很多,需要寫過程對sql語句進行拼接
然後根據你的需要再對字段進行合併
select a列,列1+','+列2+','+列3 b列
into temp_1219_result--插入結果表
from temp_1219
/*--優化
update temp_1219
set 列2=','+列2
where len(列2)>0
update temp_1219
set 列3=','+列3
where len(列3)>0
select a列,列1+列2+列3 b列
into temp_1219_result2--插入結果表
from temp_1219
*/ 案例2:
測試資料
編號 物料類別 產品編號
1 鉛筆 0001
2 鉛筆 0002
3 鉛筆 0001
4 鋼筆 0004
5 鋼筆 0005
6 鋼筆 0004
7 原子筆 0007
8 原子筆 0008
9 原子筆 0007
等等要求實現以下效果:
編號 物料類別 產品編號
1 鉛筆 0001,0002
2 鋼筆 0004,0005
3 原子筆 0007,0008
**我的目的是如果不重複則合併產品編號,如果重複則捨棄**
create table t(編號 int, 物料類別 nvarchar(10), 產品編號 char(5))
insert t select 1, '鉛筆', '0001'
union all select 2, '鉛筆', '0002'
union all select 3, '鉛筆', '0001'
union all select 4, '鋼筆', '0004'
union all select 5, '鋼筆', '0005'
union all select 6, '鋼筆', '0004'
union all select 7, '原子筆', '0007'
union all select 8, '原子筆', '0008'
union all select 9, '原子筆', '0007'
create function fun(@物料類別 nvarchar(10))
returns nvarchar(200)
asbegin
declare @re nvarchar(200)
set @re=''
select @re=@re+產品編號+',' from t where 物料類別=@物料類別 group by 產品編號
select @re=left(@re, len(@re)-1)
return @re
endselect distinct 物料類別, dbo.fun(物料類別) from t
--result
物料類別
---------- -------------------------------
鋼筆 0004 ,0005
鉛筆 0001 ,0002
原子筆 0007 ,0008
(3 row(s) affected)
後記:核心語句中最後面的group by *** 可捨棄重複。
select @re=@re+產品編號+',' from t where 物料類別=@物料類別 group by 產品編號
又一篇筆記,以備後用!!
需求:有表tb,表有兩個字段,分別為:id,value。
表中存有資料如下:id value
1 a
1 a1
1 a2
2 b
2 b1
3 c1
3 c2
需要通過查詢實現:1 a,a1,a2
2 b,b1
3 c1,c2
實現方法:
1、sql2000 使用合併函式:
create function f_tb(@id int)
returns varchar(8000)
asbegin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
set @str = right(@str , len(@str) - 1)
return(@str)
endgo
--呼叫自定義函式得到結果:
select distinct id ,dbo.f_tb(id) as value from t
2、sql2005 處理方式如下:
sql字串查詢
查詢特定格式的字元 例如 查詢姓李的學生 select from student where sname like 李 如果是查詢姓李或李兩個字或三個字的名稱 select from student where left sname,1 in 李 張 andlen sname 3and len sn...
合併字串
給定兩個字串s1和s2,合併成乙個新的字串s。合併規則為,s1的第乙個字元為s的第乙個字元,將s2的最後乙個字元作為s的第二個字元 將s1的第二個字元作為s的第三個字元,將s2的倒數第二個字元作為s的第四個字元,以此類推。包含多組測試資料,每組測試資料報含兩行,代表長度相等的兩個字串s1和s2 僅由...
合併字串
輸入兩個已經按從小到大順序排列好的字串,編寫乙個合併兩個字串的函式,使合併後的字串,仍然是從小到 大排列。輸入 兩個已經排好順序 公升序 的兩個字串 輸出 乙個合併在一起的有序 公升序 的字串 要求 設計乙個效率盡量高的演算法,對每個字串只掃瞄一遍就可以了。如果採用先進行串連線,然後再進行排序的演算...