在做報表的時辰,可能需要將查詢成果某一列的多行記實,利用逗號分隔,拼接當作一個字符串。這個時辰,該若何實現呢?好比,在bom表中,將查詢成果的物料編碼列,拼接當作一個字符串,并且,字符串中物料編碼不反復
建立一個姑且表,用于演示sqlserver數據庫中,若何將一個字段的數據拼接當作一個字符串。例如:將物料清單表中的物料編碼,利用逗號分隔,拼接當作一個字符串
IF OBJECT_ID('tempdb..#tblBom') IS NOT NULL DROP TABLE #tblBom;
CREATE TABLE #tblBom(
OrderNo varchar(50), -- 訂單號
ItemCode varchar(50), -- 物料編碼
ItemName varchar(50) -- 物料名稱
);
 往姑且表中插入幾行測試數據,模擬物料清單
insert into #tblBom(OrderNo, ItemCode, ItemName) values('PO2019001', 'MC001', '物料1');
insert into #tblBom(OrderNo, ItemCode, ItemName) values('PO2019001', 'MC002', '物料2');
insert into #tblBom(OrderNo, ItemCode, ItemName) values('PO2019001', 'MC003', '物料3');
insert into #tblBom(OrderNo, ItemCode, ItemName) values('PO2019002', 'MC001', '物料1');
insert into #tblBom(OrderNo, ItemCode, ItemName) values('PO2019003', 'MC005', '物料5');
 查詢姑且表1中的測試數據
select * from #tblBom;
 假設表中的數據很少,并且,需求也是要將所有的物料編碼,利用逗號拼接起來,那么,就可以利用for xml path語法
select ',' + ItemCode from #tblBom for xml path('')
 從上面的成果可以看出,不異的物料編碼,在字符串中反復呈現了,那么,若何才能拼接不反復的物料編碼呢?其實,直接加上去重關頭字distinct就可以了
select distinct ',' + ItemCode from #tblBom for xml path('')
 上面的物料編碼固然去重了,可是,拼接的字符串最前面是以逗號起頭的,若何才能去失落這個逗號呢?這個時辰,就需要利用stuff函數了
select (stuff((select distinct ',' + ItemCode from #tblBom for xml path('')),1,1,''))
 上面都是查詢整個表的成果,現實利用時,經常需要按照必然的前提過濾,這個時辰就需要利用聯系關系語句了
select ItenCode = (select stuff((select distinct ',' + ItemCode from #tblBom where OrderNo = tbl.OrderNo for xml path('')), 1, 1, ''))
from #tblBom tbl
where tbl.OrderNo = 'PO2019001'
group by tbl.OrderNo
 0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!