当前位置: 代码迷 >> Sql Server >> sql 瓜分 并统计 求急 大神们
  详细解决方案

sql 瓜分 并统计 求急 大神们

热度:309   发布时间:2016-04-24 10:27:46.0
sql 分割 并统计 求急 大神们

------解决方案--------------------
--参考
拆分表:

--> --> (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
  相关解决方案