Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

有条件地找出缺失的数字问题

sunny  发表于:2009-11-21 17:15:12  
复制

假如当前有一个五位数(数字可能有重复的),怎么通过下面的条件,在0~9中找出与其不同的数字?

      

       A1 ' 当前数的上一个数的个位
       A2 ' 与当前数的不同数字
       A3 ' 当前数的个位相邻的数字(个位相邻:比如当前数的个位是 5 则其相邻数字为 4和6)
       A4 ' 要求的数

 

条件一:如果当前数前面没有数,A4=A2-A3

 

条件二:如当前数前面有数, A4 = A2-A1-A3

 

举例:

 

当前数为:01233   则结果为: 56789 '因为前面没有数,由条件一算出

          

前一个数为:01233

  当前数为:01122 则结果为: 456789 '因为前面有数,由条件二算出

 

 

点击下载此附件

 

Top
andymark 发表于:2009-11-21 22:14:58

表中的ID必须连续

 

 

点击下载此附件

andymark 发表于:2009-11-21 22:26:02

修改了一下查询,ID 可以不必连续

 

 

SELECT a.id, a.编号, a.五位数字 AS 当前数, (SELECT Top 1 [五位数字] from 表1 where a.id>id ORDER BY id desc) AS Tem, iif(isnull(tem),"",tem) AS 上位数, TestNm(当前数,上位数) AS 不同的数字
FROM 表1 AS a
ORDER BY a.id;



andymark 发表于:2009-11-21 22:27:02
sunny 发表于:2009-11-21 22:50:47

和想要的效果有点出入,

 

比如

 

1.01122 想要的结果应该是 456789

 

2.前一个数 12345

  当前数 2345  结果应该是 01789

 

手动计算的步骤是这样的:

 

当前数 01122

 

1.的计算方法:由01122得出其不同数字 3456789 ,再除去 01122 个位 2的相邻数字 1和3 -->456789

 

2.的计算方法:由2345 得出其不同数字 016789 ,排除 上一个数 12345 的个位5,再排除当前数2345 个位 5的相邻数字 4和6

 

-->001789

 

 



sunny 发表于:2009-11-21 22:52:02

2.的计算方法:由2345 得出其不同数字 016789 ,排除 上一个数 12345 的个位5,再排除当前数2345 个位 5的相邻数字 4和6

 

-->01789



sunny 发表于:2009-11-21 23:04:54


andymark 发表于:2009-11-22 09:34:56

把第一个条件看错了

 

 A1 ' 当前数的上一个数的个位 错看成  A1 ' 当前数的上一个数的

 

 


 

点击下载此附件

点燃一支烟 发表于:2009-11-22 10:25:56
你的个位要是0的话,相邻的数字是如何定义呢?是只有1还是1和9?

点燃一支烟 发表于:2009-11-22 10:41:05
andymark 发表于:2009-11-22 11:06:59

假设0相邻的是1 和9

 

改一下FUNCTION就行了

 

Public Function TestNm(StrNm As String, PreNm As String) As String
 Dim i As Integer
 Dim Tem As String
 Dim EndNm As String
 Tem = ""
 
 If Right(StrNm, 1) = 0 Then
 
    EndNm = 1 & 9          '这里假设0相邻的是1 和9  这里喜欢怎么设就怎么设
    Else
    EndNm = Right(StrNm, 1) + 1 & Right(StrNm, 1) - 1
  End If
 If IsNull(prenum) Then
 
    StrNm = Trim(StrNm & EndNm)
    Else
   
 StrNm = Trim(StrNm & EndNm & Right(PreNm, 1))
 End If
 For i = 0 To 9
 
  If InStr(1, StrNm, CStr(i)) = 0 Then
    
     Tem = Tem & i
 End If
 Next
 

 TestNm = Tem
End Function

 

 

点击下载此附件

 



点燃一支烟 发表于:2009-11-22 11:34:04
同样的问题还反映在数字9 ,楼主可根据自己的诉求相应改动

andymark 发表于:2009-11-22 12:37:38

假设0 +1 -1 分别是 1 和9

9+1 -1 分别是0 和  8

 

Public Function TestNm(StrNm As String, PreNm As String) As String
 Dim i As Integer
 Dim Tem As String
 Dim EndNm As String
 Tem = ""
 
 EndNm = Right(Abs(Right(StrNm, 2) + 1), 1) & (Right(Abs(Right(StrNm, 2) - 1), 1))
 

 If IsNull(prenum) Then
 
    StrNm = Trim(StrNm & EndNm)
    Else
   
 StrNm = Trim(StrNm & EndNm & Right(PreNm, 1))
 End If
 For i = 0 To 9
 
  If InStr(1, StrNm, CStr(i)) = 0 Then
    
     Tem = Tem & i
 End If
 Next
 

 TestNm = Tem
End Function

 

 

点击下载此附件

 

 

不管你怎样定义都好,只需要在FUNCTION处理就OK

 

不涉及查询的SQL语句的更改

 

 



总记录:12篇  页次:1/1 9 1 :