看板 Database 關於我們 聯絡資訊
declare @cols nvarchar(max) -- 所有可能字串列表 ;with tb1 as ( select * from (values ('a1'),('a2'),('a3'), ('b1'),('b2'),('b3'), ('c1'),('c2'),('c3'), ('z1'),('z2'),('z3') )t(s) ) -- 組動態 pivot 所需的 in list select @cols = replace(rtrim((select QUOTENAME(s) + ' ' from tb1 for xml path(''))),' ',',') -- 測資 ;with tb1 as ( select xml = convert(xml,'<item>' + replace(string,',','</item><item>') + '</item>') from (values(1,'a1,b1,c1'),(2,'a2,c1'),(3,'d3'),(4,'a2,b1'),(5,'z1,z2') )t(seq,string) ) -- 切割字串 select s into #t from tb1 cross apply ( select col.value('.', 'nvarchar(max)') from xml.nodes('/item') as tbl(col) ) t(s) -- 執行結果 declare @sql nvarchar(max) set @sql = replace(' select * from #t pivot ( count(s) for s in ($cols) ) as pvt ','$cols',@cols) exec(@sql) drop table #t ※ 引述《otherman (總經理)》之銘言: : 資料庫名稱: MSSQL : 資料庫版本: 2014 : 內容/問題描述: : table a : seq string : 1 a1,b1,c1 : 2 a2,c1 : 3 d3 : 4 a2,b1 : 5 z1,z2 : 將string欄位分離後計算數量,然後產出如下統計表 : a1 a2 a3 b1 b2 b3 c1 c2 c3...z1 z2 z3 : ===================================== : 1 2 0 2 0 0 2 0 0 1 1 0 : 我用pivot +string_spilt 來select做出來的結果都不是我想要的,因為欄位不確定 : 請問先進們有相關的統計經驗可以指點一下嗎?謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.26.80.10 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Database/M.1614261463.A.582.html
funk6478: 簡潔多了 推~ 02/26 14:45