以下是引用wsj0608在2014-10-25 20:22:02的发言:
我有一个VF表,其中字段如下
卷号 页号 尾页号 首页号
0001 1 3 1
0001 4 7
0002 1 2 1
0002 3 5
0002 6 10
0003 1 5 1
0004 1 12 1
0004 7
0004 9
0004 13 15
大体就是这类内容的库,我有三个问题
1.显示每卷最大“尾页号”,这个命令怎么写?
2.检测每卷的“页号”和“尾页号”,两者之间的关系为“页号”必须比上一条记录的“尾页号”大“1”,就是“尾页号”=上一条记录“页号”+1,显示不符合这一条件的记录,这条命令应该怎么写
3.检测每卷第一条的“首页号”必须为1,且只有第一条的“首页号”有记录,显示不符合这一条条件的记录。这个命令应该怎么写
谢谢大家了
没有人帮助我么?
我试了很多都不对。
第一题,我先用 set filt to len(allt(尾页号))>=1 命令把“尾页号”为空的筛选掉, 之后是将“案卷号”排序,然后取“尾页号”最大值么?到这就不知道怎么写了
第二题,我不知道怎么用if语句,是 if 页号=1,0(if 尾页号=页号+1),0,1 这样么?中间过程怎么运用
第三题,没头绪,不知道怎么写
有懂的朋友帮我看看,真的琢磨不出来,谢谢了
假设表文件名为“LT1.DBF”,各字段属性为:卷号 C(4),页号 I,尾页号 I,首页号 I。
第一个问题答案(实在太简单了):SELECT 卷号,MAX(尾页号) 最大页号 FROM LT1 GROUP BY 卷号;
第二个问题答案:SELECT * FROM LT1;
WHERE 卷号+STR(页号) NOT IN;
(
SELECT DISTINCT T1.卷号+STR(T1.页号);
FROM (SELECT RECNO() 记录号,* FROM LT1) T1,;
(SELECT RECNO() 记录号,* FROM LT1) T2;
WHERE T1.尾页号=T2.页号+1 AND;
T1.记录号-T2.记录号=1)
思路:蓝色部分找出满足“尾页号”=上一条记录“页号”+1条件的记录,然后在外层查询中利用WHERE条件过滤掉这些记录,就是满足条件的所有记录。蓝色部分子查询的核心在于红色代码,即自联接查询。楼主请记住:若要在同一表中进行比较,常用两种方法:一、编程。该方法代码虽长,但可以做到层次感清晰,适合入门用户,或对SELECT-SQL命令不熟悉的用户;二、自联接。该方法层次感不如编程,但代码简短,执行速度比编程要更快,适合对SELECT-SQL命令非常熟悉的用户。
第三个问题答案:条件看上去简单,其实要注意的细节很多的一个问题。我分步给你,你自己去组装(可参考问题二组装):
1、每卷第一条的“首页号”必须为1
SELECT T1.*;
FROM (SELECT RECNO() 记录号,* FROM LT1) T1,;
(SELECT 卷号,MIN(记录号) 最小记录号;
FROM (SELECT RECNO() 记录号,* FROM LT1) T1;
GROUP BY 卷号) T2;
WHERE T1.记录号=T2.最小记录号 AND T1.首页号=1
2、只有第一条的“首页号”有记录
SELECT T1.卷号,T1.页号,T1.尾页号,T1.首页号;
FROM (SELECT RECNO() 记录号,* FROM LT1) T1,;
(SELECT 卷号,MIN(记录号) 最小记录号;
FROM (SELECT RECNO() 记录号,* FROM LT1) T1;
GROUP BY 卷号) T2;
WHERE T1.记录号=T2.最小记录号 AND T1.首页号>0 AND;
T1.卷号 IN ;
(SELECT 卷号 ;
FROM (SELECT 卷号,SUM(首页号) 首页号和;
FROM (SELECT RECNO() 记录号,* FROM LT1) T3;
WHERE 卷号+STR(记录号) NOT IN ;
(SELECT 卷号+STR(MIN(记录号));
FROM (SELECT RECNO() 记录号,* FROM LT1) T4;
GROUP BY 卷号);
GROUP BY 卷号 HAVING 首页号和=0) T5);
UNION ALL ;
SELECT * FROM LT1 ;
WHERE 卷号 IN ;
(SELECT 卷号 FROM LT1;
GROUP BY 卷号;
HAVING COUNT(卷号)=1) AND ;
首页号=1;
ORDER BY 卷号
看到这里,不知道楼主是什么心情。问题三还没有组装,就已经这么复杂了,所以我建议楼主对于问题三还是用编程吧。虽然我没针对问题三编程试验,但感觉针对问题三,配合对表文件的卷号字段进行索引后,编程的逻辑层次应该会比用SELECT-SQL命令强很多。
最后,要说说楼主给出的案例数据。基本上还行,尤其是卷号为0003只给出一条记录,在SELECT-SQL代码调试时颇有代表性(问题三答案中的蓝色代码部分就是针对只有一条记录处理的)。但有两点不足:一是数据问题。比如:问题三需要的记录,数据几乎都做出来了:每卷的第一条记录首页号都是1,下面的都没有登记,不利于代码调试;还有一个就是问题二需要的记录中,给出的数据没有一条记录是达到要求的,最后我通过手动把卷号0003的尾页号改成7,才得以调试代码;二是逻辑问题。比如:同样是卷号0001,为什么尾页号在第一、二条记录间是不同的呢?难道同个卷宗的结尾页码是不相同的?或是相同的卷号代表着不同的卷宗?不管怎样,楼主都可以从这个案例中获得不少的知识。