Office中国论坛/Access中国论坛

标题: 一行变多行的问题 [打印本页]

作者: hunter4162003    时间: 2007-6-25 21:50
标题: 一行变多行的问题
我想要把一行转变为多行,例

a 11,10,14,.....

b      58,73,386,...

c      1023,1325,2986

就像上面这样,一格中有8或9个数据,要把他们折开,前面的信息不变,转换为

a   11

a   10

a   14

b  58

b  73

b  386

c  1023

c1325 ......

请问在access中可否实现,应该如何实现,谢谢啦。
作者: tz-chf    时间: 2007-6-26 03:21
用记录集,把11,10,14,。。。转为数组,再追加。。。
作者: djt    时间: 2007-6-26 18:52
请参阅如何向参数查询传递参数
http://www.office-cn.net/forum.php?mod=viewthread&tid=54867&replyID=&skin=1

作者: 瑭瑭    时间: 2007-6-27 06:14
刚刚看过楼上的链接

Parameters lngCaseNo string;



Select *



from Cases where CaseNo in (Select mid(lngCaseNo&',',first(CaseNo),Last(CaseNo)-first(CaseNo)) from Cases where CaseNo<=len(lngCaseNo)+1 Group by instr(CaseNo,lngCaseNo&',',','))

楼上的可以帮助解释一下这个代码的意思吗,我是一个用Access2000入门的学生,上面的代码用Access2000可以运行吗。

谢谢先

[em04]
作者: andymark    时间: 2007-6-27 07:28
论坛有多行变一行的例子,反操作写个FUNCTION
作者: djt    时间: 2007-6-27 16:17
新建一个辅助表 Cases,字段CaseNo,长整型,输入从1-10000,此辅助表的用处很大。
再建一个要行变列表Test,字段T2,T1,输入
t2        t1
a 11,10,14
b    50,73,386
c    1023,1325,2986
新建查询
SELECT t2,t1,instr(CaseNo+1,t1 & ',',',') AS lngMid, mid(t1,CaseNo,lngmid-caseNo) as RowToColumn
FROM Cases, Test
WHERE instr(CaseNo+1,t1 & ',',',',)<>0 and caseno<=len(t1)+2 And mid(',' & t1 & ',',caseno,1)=','
order by t2
这个代码可能理解起来比较简单,我用了10年才想到的,虽然用VBA可以很简单的实现,但是用SQL直接解决实际问题,可能会获得更大的乐趣

作者: djt    时间: 2007-6-27 16:38
这个查询简单理解就是判断t1有多少个字符,每个字符产生一行(由辅助表生成)
From Cases,Test 此语句生成2个表的哈希连接,假如cases有100行,test有10行,那么生成一个有100X10=1000行的查询,然后在条件语句中限制 mid(',' & t1 & ',',caseno,1)=',' ,把t1变为头尾都有“,”,查询结果限制为只有“,”的那些行。
比如说11,10,14变成,11,10,14,有“,”的位置为1,4,7,10
instr(CaseNo,t1 & ',',',')<>0 理解为:11,10,14变成11,10,14,   有“,”的位置为3,6,9


作者: wwwwa    时间: 2007-6-27 23:08
1、SQL语句比较巧妙,原来处理这种情况都是用VBA;
2、效率不高,1-10000都要判断一次,记录数10000*工作表记录数;
3、如工作表是备注字段,最大可储存2G,SQL语句处理起来有点问题。

作者: djt    时间: 2007-6-27 23:25
caseno<=len(t1)+2
这个条件判断是限制返回多少行,
通常这样的字符串不会超过200个字符





欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3