[请教]SQL Server中将一列拆分成多列的问题

berrylala 2009-07-08 10:29:52
大家好 我想把数据库中A图的结构变成B图的结构(“M4,M5,M6”是一字符串)
p_code p_material
P4 M4,M5,M6
P5 M1,M32,M27
……
(A图)

p_code p_material
P4 M4
P4 M5
P4 M6
P5 M1
……
(B图)

我是这么想的,先将A图拆分成C图,然后再行列转换
p_code p_material1 p_material2 p_material3
P4 M4 M5 M6
P5 M1 M32 M27
……
(C图)

在将A图拆分成C图时,具体做法是先将"M4,M5,M6"拆分为形如"M4;M5,M6"两列;然后再将"M5,M6"拆分成"M5;M6"两列;然后更新SQL Server的表。
将"M4,M5,M6"拆分为形如"M4;M5,M6"两列的SQL 语句如下(先在表orders中新建2列p_material1和p_material2):
use test
update orders
set p_material1=(select substring(p_material,1, (charindex(',',p_material)-1)) from orders )
set p_material2=(select substring(p_material, (charindex(',',p_material)+1),len(p_material)) from orders)
go
结果报“=”附近有语法错误,不知道怎样修改才正确。
此外,我想从A图变成B图,有没有比较简单一些的方法,以C图作为桥梁貌似比较复杂。
请大家帮忙看看 非常感谢!
...全文
439 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
victorcai2006 2009-07-08
  • 打赏
  • 举报
回复
MARK,大乌龟以前给出过相关代码
berrylala 2009-07-08
  • 打赏
  • 举报
回复
恩 多谢各位了 我得花点儿时间消化消化
不过单说下面这段拆分列更新表的程序段该怎么修改正确呢?估计以后还会碰到这类问题,所以想把它弄清楚,多谢啦!
use test
update orders
set p_material1=(select substring(p_material,1, (charindex(',',p_material)-1)) from orders )
set p_material2=(select substring(p_material, (charindex(',',p_material)+1),len(p_material)) from orders)
go
子陌红尘 2009-07-08
  • 打赏
  • 举报
回复
declare @t table(p_code varchar(10),p_material varchar(20))
insert into @t select 'P4','M4,M5,M6'
insert into @t select 'P5','M1,M32,M27'


select
p_code,
cast(parseName(replace(p_material,',','.'),3) as varchar(10)) p_material1,
cast(parseName(replace(p_material,',','.'),2) as varchar(10)) p_material2,
cast(parseName(replace(p_material,',','.'),1) as varchar(10)) p_material3
from
@t

/*
p_code p_material1 p_material2 p_material3
---------- ----------- ----------- -----------
P4 M4 M5 M6
P5 M1 M32 M27
*/
子陌红尘 2009-07-08
  • 打赏
  • 举报
回复
declare @t table(p_code varchar(10),p_material varchar(20))
insert into @t select 'P4','M4,M5,M6'
insert into @t select 'P5','M1,M32,M27'


select
p_code,
parseName(replace(p_material,',','.'),3) as p_material1,
parseName(replace(p_material,',','.'),2) as p_material2,
parseName(replace(p_material,',','.'),1) as p_material3
from
@t
jiangshun 2009-07-08
  • 打赏
  • 举报
回复

--> 测试时间:2009-07-08 22:34:12
--> 我的淘宝: http://shop36766744.taobao.com/

if object_id('[tab]') is not null drop table [tab]
create table [tab]([p_code] varchar(2),[p_material] varchar(10))
insert [tab]
select 'P4','M4,M5,M6' union all
select 'P5','M1,M32,M27'

select * from [tab]

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.p_code,p_material=substring(a.p_material,b.ID,charindex(',',a.p_material+',',b.ID)-b.ID)
from
Tab a,#Num b
where
charindex(',',','+a.p_material,b.ID)=b.ID --也可用 substring(','+a.COl2,b.ID,1)=','

/*
p_code p_material
------ ----------
P4 M4
P4 M5
P4 M6
P5 M1
P5 M32
P5 M27

(所影响的行数为 6 行)


*/

drop table tab,#Num
feixianxxx 2009-07-08
  • 打赏
  • 举报
回复
-- =========================================
-- -----------t_mac 小编-------------
---希望有天成为大虾----
-- =========================================

IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb(p_code varchar(10),p_material varchar(100))
go
insert into tb
select 'p4','M4,M5,M6' union all
select 'p5','M1,M32,M27'
go
SELECT TOP 1000 id = IDENTITY(int, 1, 1) INTO a FROM syscolumns a, syscolumns b

SELECT p_code, SUBSTRING(A.p_material, B.id, CHARINDEX(',', A.p_material + ',', B.id) - B.id) as value
FROM tb A, a B
WHERE SUBSTRING(',' + A.p_material, B.id, 1) = ','
order by p_code
/*------------
p4 M4
p4 M5
p4 M6
p5 M1
p5 M32
p5 M27
-------*/

34,576

社区成员

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

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