当前位置: 代码迷 >> Sql Server >> SQL查询、构造
  详细解决方案

SQL查询、构造

热度:33   发布时间:2016-04-24 09:22:37.0
SQL查询、结构
有如下表结构和数据:
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
  相关解决方案