求大神帮忙,

默先生 2017-09-11 02:19:17
这是批量数据,请问大神如何用SQL得到
城市年鉴
城市年鉴>城市年鉴
城市年鉴>二、地级以上城市统计资料>(一)人口、劳动力及土地资源>
城市年鉴>二、地级以上城市统计资料>(一)人口、劳动力及土地资源>2-1人口状况
城市年鉴>二、地级以上城市统计资料>(一)人口、劳动力及土地资源>2-1人口状况>年平均人口
城市年鉴>二、地级以上城市统计资料>(一)人口、劳动力及土地资源>2-3按产业划分的年末城镇单位从业人员
(等等等......)
小弟是实习生,求大神帮忙,急用,谢谢
...全文
218 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
听雨停了 2017-09-11
  • 打赏
  • 举报
回复

--测试数据
if not object_id(N'Tempdb..#T1') is null
    drop table #T1
Go
Create table #T1([LinearCode] nvarchar(4000))
Insert #T1
select N'1' union all
select N'1.1' union all
select N'1.2.3'
GO
if not object_id(N'Tempdb..#T2') is null
    drop table #T2
Go
Create table #T2([DataSourceId] int,[DataSourceDescription] nvarchar(34))
Insert #T2
select 1,N'城市年鉴' union all
select 2,N'二、地级以上城市统计资料' union all
select 3,N'(一)人口、劳动力及土地资源'
Go
--测试数据结束
DECLARE @count INT ,@i INT ,@sql VARCHAR(500)
SELECT @count= COUNT(1) FROM #T2
SET @i=1
if not object_id(N'Tempdb..#tab1') is null
    drop table #tab1
Create table #tab1(
	[LinearCode] nvarchar(25),
	[LinearCode_.] VARCHAR(max)
)
--把#t1的数据插入#tab1
INSERT INTO #tab1
SELECT [LinearCode],[LinearCode]+'.' AS [LinearCode_.] 
FROM #t1
--把#t2的数据插入#tab2
if not object_id(N'Tempdb..#tab2') is null
	DROP TABLE #tab2
SELECT * ,row_number() over( ORDER BY [DataSourceId]) AS num 
into #tab2 FROM #t2
--循环替换
WHILE @i<=@count
BEGIN
	SET @sql='update #tab1 set [LinearCode_.]=replace([LinearCode_.],cast([DataSourceId] as varchar(5))+''.'',[DataSourceDescription]+''>'') 
	          FROM #tab1 ,#tab2
	          WHERE #tab2.num='+cast(@i AS VARCHAR(5))
	SET @i=@i+1
	PRINT @sql
	EXEC (@sql)
END
UPDATE #tab1 SET [LinearCode_.]=left([LinearCode_.],LEN([LinearCode_.])-1)
SELECT * FROM #tab1
LinearCode                LinearCode_.
------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1                         城市年鉴    
1.1                       城市年鉴>城市年鉴        
1.2.3                     城市年鉴>二、地级以上城市统计资料>(一)人口、劳动力及土地资源                              

(3 行受影响)
二月十六 版主 2017-09-11
  • 打赏
  • 举报
回复
写了个例子不知道是不是这样(gt;是被转义过后的>):
CREATE FUNCTION dbo.f_splite
(
@s VARCHAR(8000) , --待分拆的字符串
@split VARCHAR(10) --数据分隔符
)
RETURNS @re TABLE (id INT,col VARCHAR(100) )
AS
BEGIN
DECLARE @splitlen INT
DECLARE @i INT = 1
SET @splitlen = LEN(@split + 'a') - 2
WHILE CHARINDEX(@split, @s) > 0
BEGIN
INSERT @re
VALUES ( @i,LEFT(@s, CHARINDEX(@split, @s) - 1) )
SET @s = STUFF(@s, 1, CHARINDEX(@split, @s) + @splitlen, '')
SET @i = @i +1
END
INSERT @re
VALUES ( @i,@s )
RETURN
END
GO


--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([LinearCode] nvarchar(25))
Insert #T1
select N'1' union all
select N'1.1' union all
select N'1.2.3'
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([DataSourceId] int,[DataSourceDescription] nvarchar(34))
Insert #T2
select 1,N'城市年鉴' union all
select 2,N'二、地级以上城市统计资料' union all
select 3,N'(一)人口、劳动力及土地资源'
Go
--测试数据结束
SELECT * ,
STUFF(( SELECT '>' + #T2.DataSourceDescription
FROM ( SELECT col
FROM dbo.f_splite(LinearCode, '.')
) t1
JOIN #T2 ON t1.col = #T2.DataSourceId
FOR
XML PATH('')
), 1, 1, '') AS DataSourceDescription
FROM #T1



默先生 2017-09-11
  • 打赏
  • 举报
回复
是1,2,3,4,5分别与第二张表的DataSourceId匹,然后合成一列显示中间用'>'
听雨停了 2017-09-11
  • 打赏
  • 举报
回复
你是要把1.2.3.4.5这样的数据拆分成字段显示吗?
默先生 2017-09-11
  • 打赏
  • 举报
回复
SELECT top 100 percent NodeId,LinearCode,t.DataSourceId,t.LinearCode,
MAX(CASE WHEN rownum = 1 THEN v ELSE null END) F_Size01,
MAX(CASE WHEN rownum = 2 THEN v ELSE null END) F_Size02,
MAX(CASE WHEN rownum = 3 THEN v ELSE null END) F_Size03,
MAX(CASE WHEN rownum = 4 THEN v ELSE null END) F_Size04,
MAX(CASE WHEN rownum = 5 THEN v ELSE null END) F_Size05
FROM
(SELECT NodeId,LinearCode,DataSourceId,
SUBSTRING(t.LinearCode, number ,CHARINDEX('.',LinearCode+'.',number)-number) AS v,
ROW_NUMBER() OVER(PARTITION BY LinearCode ORDER BY getdate() ) rownum
FROM [Caad.DataPlatform].[dbo].[DataSourceHierarchy] AS t,MASTER..spt_values s
WHERE s.number >=1
and s.TYPE = 'P'
and SUBSTRING('.'+t.LinearCode,s.number,1) = '.'
) t
GROUP BY NodeId,LinearCode,t.DataSourceId
ORDER BY NodeId
得到
然后关联
通过F_Size01,F_Size02,F_Size03,F_Size04,F_Size05 与DataSourceId 匹要得到
城市年鉴
城市年鉴>城市年鉴
城市年鉴>二、地级以上城市统计资料>(一)人口、劳动力及土地资源>
城市年鉴>二、地级以上城市统计资料>(一)人口、劳动力及土地资源>2-1人口状况
城市年鉴>二、地级以上城市统计资料>(一)人口、劳动力及土地资源>2-1人口状况>年平均人口
城市年鉴>二、地级以上城市统计资料>(一)人口、劳动力及土地资源>2-3按产业划分的年末城镇单位从业人员
(等等等......)这样的数据,求帮忙
二月十六 版主 2017-09-11
  • 打赏
  • 举报
回复
没太看明白什么意思,建议楼主简化一下测试数据 列出表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧