
------解决方案--------------------
--参考
拆分表:
--> --> (Roy)生成測試數據
if not object_id('Tab') is null
drop table Tab
Go
Create table Tab([Col1] int,[COl2] nvarchar(5))
Insert Tab
select 1,N'a,b,c' union all
select 2,N'd,e' union all
select 3,N'f'
Go
--SQL2000用辅助表:
if object_id('Tempdb..#Num') is not null
drop table #Num
go
select top 100 ID=Identity(int,1,1) into #Num from syscolumns a,syscolumns b
Select
a.Col1,COl2=substring(a.Col2,b.ID,charindex(',',a.Col2+',',b.ID)-b.ID)
from
Tab a,#Num b
where
charindex(',',','+a.Col2,b.ID)=b.ID --也可用 substring(','+a.COl2,b.ID,1)=','
--2000不使用辅助表
Select
a.Col1,COl2=substring(a.Col2,b.number,charindex(',',a.Col2+',',b.number)-b.number)
from
Tab a join master..spt_values b
ON B.type='p' AND B.number BETWEEN 1 AND LEN(A.col2)
where
substring(','+a.COl2,b.number,1)=','
SQL2005用Xml:
select
a.COl1,b.Col2
from
(select Col1,COl2=convert(xml,'<root><v>'+replace(COl2,',','</v><v>')+'</v></root>') from Tab)a
outer apply
(select Col2=C.v.value('.','nvarchar(100)') from a.COl2.nodes('/root/v')C(v))b
SQL05用CTE:
;with roy as
(select Col1,COl2=cast(left(Col2,charindex(',',Col2+',')-1) as nvarchar(100)),Split=cast(stuff(COl2+',',1,charindex(',',Col2+','),'') as nvarchar(100)) from Tab
union all
select Col1,COl2=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),'') as nvarchar(100)) from Roy where split>''
)
select COl1,COl2 from roy order by COl1 option (MAXRECURSION 0)
生成结果:
/*
Col1 COl2
----------- -----
1 a
1 b
1 c
2 d
2 e
3 f
*/
自己去照着写。
------解决方案--------------------
-- DROP TABLE tb;
CREATE TABLE tb(infoLoans nvarchar(50))
INSERT INTO dbo.tb (infoLoans) VALUES ('个人货款.信用卡分期.汽车.')
INSERT INTO dbo.tb (infoLoans) VALUES ('个人货款.信用卡分期.现金.小企业货款.成长之路.')
INSERT INTO dbo.tb (infoLoans) VALUES ('小企业货款.成长之路.')
INSERT INTO dbo.tb (infoLoans) VALUES ('个人货款.信用卡分期现金.小企业贷款.成长之路.')
INSERT INTO dbo.tb (infoLoans) VALUES ('个人货款.企业货款.')
INSERT INTO dbo.tb (infoLoans) VALUES ('小企业货款.成长之路.')
INSERT INTO dbo.tb (infoLoans) VALUES ('小企业货款.')
INSERT INTO dbo.tb (infoLoans) VALUES (null)
INSERT INTO dbo.tb (infoLoans) VALUES (null)
INSERT INTO dbo.tb (infoLoans) VALUES ('公司货款.流动资金货款.')
SELECT re.[VALUE],COUNT(1) ct FROM (
SELECT r1.VALUE FROM tb AS t
CROSS APPLY(
SELECT s.[Value]
FROM dbo.[Split](t.infoLoans,'.') AS s WHERE s.[Value]<>''
) r1
) re
GROUP BY re.[VALUE]
ORDER BY ct DESC;
/*
--结果
VALUE ct
-------------------- -----------
成长之路 4
个人货款 4
小企业货款 4
信用卡分期 2
信用卡分期现金 1
公司货款 1
流动资金货款 1
企业货款 1
汽车 1
现金 1