有如下表结构和数据:
title content
标题一 厂名:膳太汤料 厂址:广东 厂家联系方式:13570533705 保质期:180 食品添加剂:无 包装方式: 散装 重量(g): 50
标题二 生产许可证编号: 厂名:浙江诸暨.绿苑铁皮石斛 厂址:浙江.诸暨. 厂家联系方式:13157512802 品牌: 绿苑铁皮石斛 系列: 铁皮石斛干花 规格: 10g 重量(g): 20 营养品种类: 铁皮
标题三 包装方式: 散装 重量(g): 300 产地: 中国大陆 省份: 安徽省 城市: 六安市
由于想做各种类型的统计
想转换成如下表结构:
title 厂名 厂址 厂家联系方式 保质期 食品添加剂 包装方式 重量(g) 生产许可证编号 品牌 系列 规格 营养品种类 产地 省份 城市
标题一 膳太汤料 广东 13570533705 180 无 散装 50 空 空 空 空 空 空 空 空
标题二 浙江诸暨.绿苑铁皮石斛 浙江.诸暨. 13157512802 空 空 空 空 空 空 绿苑铁皮石斛 铁皮石斛干花 10g 20 铁皮 空 空 空
标题三 空 空 空 空 空 散装 300 空 空 空 空 空 中国大陆 安徽省 六安市
意思就是把content中的数据变成字段,可以根据字符串的“:”进行截断。
在下实在写不出来,求语句,只有能得到类似这种表都行。
谢谢!
------解决思路----------------------
--基本思路先根据空格转换成行,然后根据:分成两列,然后再行专列。当然在数据规范的情况下。
with T(title,content) as
(select '标题一','厂名:膳太汤料 厂址:广东 厂家联系方式:13570533705 保质期:180 食品添加剂:无 包装方式: 散装 重量(g): 50'
union all
select '标题二','生产许可证编号: 厂名:浙江诸暨.绿苑铁皮石斛 厂址:浙江.诸暨. 厂家联系方式:13157512802 品牌: 绿苑铁皮石斛 系列: 铁皮石斛干花 规格: 10g 重量(g): 20 营养品种类: 铁皮'
union all
select '标题三','包装方式: 散装 重量(g): 300 产地: 中国大陆 省份: 安徽省 城市: 六安市')
select distinct title,LEFT(content,CHARINDEX(':',content)-1) as content,RIGHT(content,len(content)-charindex(':',content)) as des into #T from
(select title,SUBSTRING(content,number,CHARINDEX(' ',content+' ',number)-number) as content
from T,master..spt_values b where type='P' and number>=1 and number<=LEN(content) and SUBSTRING(' '+content,number,2)=' ') a
where CHARINDEX(':',content)>0
declare @s varchar(max)
select @s=ISNULL(@s+',','')+'max(case when content='''+content+''' then des end) as ['+content+']'
from #T group by content
set @s='select title,'+@s+' from #t group by title'
exec(@s)
drop table #t
------解决思路----------------------
对数据格式要求比较高,
假设 名称:描述 这样的键值对
名称和描述都不含空格,且键值对之间的空格为两个
;WITH TB(title,[CONTENT]) AS(
SELECT '标题一','厂名:膳太汤料 厂址:广东 厂家联系方式:13570533705 保质期:180 食品添加剂:无 包装方式: 散装 重量(g): 50'
UNION ALL SELECT '标题二','生产许可证编号: 厂名:浙江诸暨.绿苑铁皮石斛 厂址:浙江.诸暨. 厂家联系方式:13157512802 品牌: 绿苑铁皮石斛 系列: 铁皮石斛干花 规格: 10g 重量(g): 20 营养品种类: 铁皮 '
UNION ALL SELECT '标题三','包装方式: 散装 重量(g): 300 产地: 中国大陆 省份: 安徽省 城市: 六安市'
)
,CTETB AS(
SELECT T1.title,T2.V1,T2.V2 FROM
(SELECT title,CONVERT(XML,'<V><V0><V1>'+REPLACE(REPLACE([CONTENT],':','</V1><V2>'),' ','</V2></V0><V0><V1>')+'</V2></V0></V>')VS FROM TB)T1
OUTER APPLY(SELECT N.V.query('V1').value('.','VARCHAR(100)')V1,N.V.query('V2').value('.','VARCHAR(100)')V2 FROM T1.VS.nodes('//V0')N(V))T2
)
SELECT
title
,MAX(CASE V1 WHEN '厂名'THEN V2 END)[厂名]
,MAX(CASE V1 WHEN '厂址'THEN V2 END)[厂址]
,MAX(CASE V1 WHEN '厂家联系方式'THEN V2 END)[厂家联系方式]
,MAX(CASE V1 WHEN '保质期'THEN V2 END)[保质期]
,MAX(CASE V1 WHEN '食品添加剂'THEN V2 END)[食品添加剂]
,MAX(CASE V1 WHEN '包装方式'THEN V2 END)[包装方式]
,MAX(CASE V1 WHEN '重量(g)'THEN V2 END)[重量(g)]
,MAX(CASE V1 WHEN '生产许可证编号'THEN V2 END)[生产许可证编号]
,MAX(CASE V1 WHEN '品牌'THEN V2 END)[品牌]
,MAX(CASE V1 WHEN '系列'THEN V2 END)[系列]
,MAX(CASE V1 WHEN '规格'THEN V2 END)[规格]
,MAX(CASE V1 WHEN '营养品种类'THEN V2 END)[营养品种类]
,MAX(CASE V1 WHEN '产地'THEN V2 END)[产地]
,MAX(CASE V1 WHEN '省份'THEN V2 END)[省份]
,MAX(CASE V1 WHEN '城市'THEN V2 END)[城市]
FROM CTETB
GROUP BY title