SQL查询、结构

h422274755 2014-10-29 10:56:17
有如下表结构和数据:
title content
标题一 厂名:膳太汤料 厂址:广东 厂家联系方式:13570533705 保质期:180 食品添加剂:无 包装方式: 散装 重量(g): 50

标题二 生产许可证编号: 厂名:浙江诸暨.绿苑铁皮石斛 厂址:浙江.诸暨. 厂家联系方式:13157512802 品牌: 绿苑铁皮石斛 系列: 铁皮石斛干花 规格: 10g 重量(g): 20 营养品种类: 铁皮

标题三 包装方式: 散装 重量(g): 300 产地: 中国大陆 省份: 安徽省 城市: 六安市



由于想做各种类型的统计
想转换成如下表结构:


title 厂名 厂址 厂家联系方式 保质期 食品添加剂 包装方式 重量(g) 生产许可证编号 品牌 系列 规格 营养品种类 产地 省份 城市

标题一 膳太汤料 广东 13570533705 180 无 散装 50 空 空 空 空 空 空 空 空

标题二 浙江诸暨.绿苑铁皮石斛 浙江.诸暨. 13157512802 空 空 空 空 空 空 绿苑铁皮石斛 铁皮石斛干花 10g 20 铁皮 空 空 空

标题三 空 空 空 空 空 散装 300 空 空 空 空 空 中国大陆 安徽省 六安市


意思就是把content中的数据变成字段,可以根据字符串的“:”进行截断。

在下实在写不出来,求语句,只有能得到类似这种表都行。
谢谢!
...全文
250 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
还在加载中灬 2014-10-29
  • 打赏
  • 举报
回复
还有,有没有这样的~~ 厂:址:膳太:汤料 就是用来区分的关键字 : 在名称和描述里面也有
还在加载中灬 2014-10-29
  • 打赏
  • 举报
回复
就是会复杂一点 厂 名:膳太汤料 连厂名里面也有空格,这样的情况有没有? 有的话,就无法区分 厂 名:膳 太 汤 料 厂 址:膳太汤料
h422274755 2014-10-29
  • 打赏
  • 举报
回复
是有可能会有,如果那样太难,可以先不考虑。谢谢了。
还在加载中灬 2014-10-29
  • 打赏
  • 举报
回复
“:”用这个好区分,但还需要有以空格区分,你的数据会有这种情况吗 厂名:膳太 汤 料 这样单个里面也有空格~~
h422274755 2014-10-29
  • 打赏
  • 举报
回复
自己顶下,求语句,求思路。
Tiger_Zhao 2014-10-29
  • 打赏
  • 举报
回复
这种属于未经预处理的非规则数据,不应该入数据库。
最好先用程序解析一下,拆分后再入数据库。

不要用SQL来处理非规则的数据,太影响服务器性能了。
随便找个客户端,用程序处理不仅灵活的多,而且不影响其他客户端正常访问数据库。
还在加载中灬 2014-10-29
  • 打赏
  • 举报
回复
/* 标题一 膳太汤料 广东 13570533705 180 无 散装 50 NULL NULL NULL NULL NULL NULL NULL NULL 标题二 浙江诸暨.绿苑铁皮石斛 浙江.诸暨. 13157512802 NULL NULL NULL 20 绿苑铁皮石斛 铁皮石斛干花 10g 铁皮 NULL NULL NULL 标题三 NULL NULL NULL NULL NULL 散装 300 NULL NULL NULL NULL NULL 中国大陆 安徽省 六安市 */
还在加载中灬 2014-10-29
  • 打赏
  • 举报
回复
对数据格式要求比较高, 假设 名称:描述 这样的键值对 名称和描述都不含空格,且键值对之间的空格为两个
;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
xxfvba 2014-10-29
  • 打赏
  • 举报
回复
--基本思路先根据空格转换成行,然后根据:分成两列,然后再行专列。当然在数据规范的情况下。 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

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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