(紧急)如何拆分以下数据,在线等

jk94819481 2013-08-01 08:26:10
要将以下数据“位号”进行拆分

数据库为

物资名称 型号 数量 位号
电阻 A1 5 q1,q2,q3,q4,q5
电阻 A2 1 w1
电阻 A3 6 e1,e2,e3,e4,e5,e6

拆分后的正确数据为

物资名称 型号 数量 位号
电阻 A1 5 q1
电阻 A1 5 q2
电阻 A1 5 q3
电阻 A1 5 q4
电阻 A1 5 q5
电阻 A2 1 w1
电阻 A3 6 e1
电阻 A3 6 e2
电阻 A3 6 e3
电阻 A3 6 e4
电阻 A3 6 e5
电阻 A3 6 e6
...全文
203 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
WWWWA 2013-08-02
  • 打赏
  • 举报
回复
生成辅助表LSB,字段BH,内容1-1000 Create Cursor 原表 (物资名称 C(10),型号 C(10),数量 I,位号 C(50)) Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A1',5,'q1,q2,q3,q4,q5') Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A2',1,'w1') Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A3',6,'e1,e2,e3,e4,e5,e6') Browse && 原表数据' SELECT a.*,b.bh,STREXTRACT(','+a.位号+',',',',',',b.bh)+SPACE(33) FROM 原表 a inner JOIN lsb b ON LEN(ALLTRIM(a.位号))>=b.bh
十豆三 2013-08-02
  • 打赏
  • 举报
回复
Close Databases All
Create Cursor 原表 (物资名称 C(10),型号 C(10),数量 I,位号 C(50))
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A1',5,'q1,q2,q3,q4,q5')
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A2',1,'w1')
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A3',6,'e1,e2,e3,e4,e5,e6')
Browse		&& 原表数据'

Select * Into Table 结果表 From 原表 Where 1=0
Select 原表
Scan
	lnArrayRowNum=Alines(aArray,Strtran(原表.位号,',',Chr(13)))
	For lnI=1 To lnArrayRowNum
		Insert Into 结果表 (物资名称,型号,数量,位号) Values (原表.物资名称,原表.型号,原表.数量,aArray(lnI))
	Endfor
Endscan
Select 结果表
Browse
xuzuning 2013-08-02
  • 打赏
  • 举报
回复
xuzuning 2013-08-02
  • 打赏
  • 举报
回复
通常在这种应用中,被聚集的项目(比如你的位号)都有一个表用于存储相关的信息 所以可以这样写
CREATE CURSOR 位号表 ( 位号 C(2) )
INSERT INTO 位号表 VALUES ('q1')
INSERT INTO 位号表 VALUES ('q2')
INSERT INTO 位号表 VALUES ('q3')
INSERT INTO 位号表 VALUES ('q4')
INSERT INTO 位号表 VALUES ('q5')
INSERT INTO 位号表 VALUES ('q6')
INSERT INTO 位号表 VALUES ('e1')
INSERT INTO 位号表 VALUES ('e2')
INSERT INTO 位号表 VALUES ('e3')
INSERT INTO 位号表 VALUES ('e4')
INSERT INTO 位号表 VALUES ('e5')
INSERT INTO 位号表 VALUES ('e6')
INSERT INTO 位号表 VALUES ('w1')
INSERT INTO 位号表 VALUES ('w2')

CREATE CURSOR 数据表 ( 物资名称 C(10), 型号 C(10), 数量 N(2,0), 位号 C(50) )
INSERT INTO 数据表 VALUES ('电阻', 'A1', 5, 'q1,q2,q3,q4,q5')
INSERT INTO 数据表 VALUES ('电阻', 'A2', 1, 'w1')
INSERT INTO 数据表 VALUES ('电阻 ', 'A3', 6, 'e1,e2,e3,e4,e5,e6')

SELECT a.物资名称, a.型号, a.数量, b.位号 from 数据表 a, 位号表 b where find_in_set(b.位号, a.位号) > 0

FUNCTION find_in_set(v, s)
PRIVATE ALL
ALINES(a, s, ',')
RETURN ASCAN(a, v)
xilaianzxsc 2013-08-02
  • 打赏
  • 举报
回复
如果数据量不大,我一般是手工处理一下。 如果数据量大,才会逼着我去写代码。
lygcw9602 2013-08-02
  • 打赏
  • 举报
回复
谢谢豆老师耐心的讲解,确实被逗号搞晕了,你那样写就明白了。
十豆三 2013-08-02
  • 打赏
  • 举报
回复
上面其中黑色逗号为参数之间的分隔符
十豆三 2013-08-02
  • 打赏
  • 举报
回复
STREXTRACT(','+a.位号+',',[,],",",b.bh) 这样写你应该就明白了 红色部分:是要 搜索的字符串,前后加逗号是为了取每2个逗号之间的字符。 蓝色部分:开始分隔符 绿色部分:结束分隔符 b.bh:是从第几处取 因为 WWWWA 都用单引号表示逗号字符,所以你可能看晕了。
lygcw9602 2013-08-02
  • 打赏
  • 举报
回复
W版能讲下 STREXTRACT(','+a.位号+',',',',',',b.bh) 这个的用法吗,好像与帮助文件中讲的不一样
lygcw9602 2013-08-02
  • 打赏
  • 举报
回复
W版的意思:
CREATE CURSOR lsb (bh n(4))
FOR I=1 TO 10
    INSERT INTO LSB VALUES (I)
ENDFOR
Create Cursor 原表 (物资名称 C(10),型号 C(10),数量 I,位号 C(50))
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A1',5,'q1,q2,q3,q4,q5')
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A2',1,'w1')
Insert Into 原表 (物资名称,型号,数量,位号) Values ('电阻','A3',6,'e1,e2,e3,e4,e5,e6')
*Browse        && 原表数据'
SELECT 物资名称,型号,数量,WH 位号 FROM (SELECT a.*,b.bh,STREXTRACT(','+a.位号+',',',',',',b.bh)+SPACE(33) WH FROM 原表 a inner JOIN lsb b ON LEN(ALLTRIM(a.位号))>=b.bh) A WHERE NOT EMPTY(WH)
lygcw9602 2013-08-01
  • 打赏
  • 举报
回复
CREATE CURSOR T (物资名称 C(4),型号 C(2),数量 N(2),位号 C(2)) SELECT AB &&原表 SCAN FOR I=1 TO ALINES(AA,ALLTRIM(位号),[,]) INSERT INTO T VALUES (AB.物资名称,AB.型号,AB.数量,AA[I]) ENDFOR ENDSCAN SELECT T BROWSE

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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