请高人指点一下,具有一定的难度

jubenben 2008-10-15 02:22:57
我现在用VF制作一个表,原表是这样的:
号码 数量
025 4
357 3
089 9
052 2
520 6
980 2
573 10

我需要运行出来的结果为:
025 12
089 11
357 13

即百位、十位、个位的数的次序不管是怎么变只要是相同的数,就当为一个数,将数量相加,同时还有按顺序排序:025、089、357
恳求各位高手研究一下,高分相赠~
...全文
243 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
jubenben 2008-10-19
  • 打赏
  • 举报
回复
出差了2天,今天下午才回来
我刚才都详细看了大家的算法,让我很是大饱眼福
在这谢谢大家帮我解决一个大问题,同时也让我学到了不少知识
同时也感觉到自己相比大家还是有一定距离呀,继续努力~
Foxer 2008-10-19
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 dkfdtf 的回复:]
改一下算法试试,记得 ms 不推荐在 sql 语句中使用 udf:

select min(hm), sum(sl), id from ( ;
select hm, sl, ;
(2^(asc(left(hm,1))-47)+2^(asc(substr(hm,2,1))-47)+2^(asc(substr(hm,3,1))-47))*;
asc(left(hm,1))*asc(substr(hm,2,1))*asc(substr(hm,3,1)) as id ;
from tt) as tmp ;
group by id order by 1 into cursor result
[/Quote]


这个表达式够复杂了,我觉得,是不是可以考虑把2^去掉呢?

实际上,MS不推荐SQL使用UDF的本意是UDF无法优化,而楼主这个问题基本上不能优化(仅限于当前情况)。
按道理,这个表中应该有另外一个字段,类似于:
号码 编号 数量
025 025 4
357 357 3
089 089 9
052 025 2
520 025 6
980 089 2
573 357 10

这样,就根本不需要这些复杂的SQL语句了。很多时候,良好的数据结构能够让代码简单高效。

都市夜猫 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 WWWWA 的回复:]
不错,简要介绍一下思路如何?
[/Quote]

哈哈,同样没有经过严格的数学证明,只是改了算法表达式以求减少重复概率而已,有时间的话倒是可以找出个可以得到唯一值的简单算法
WWWWA 2008-10-17
  • 打赏
  • 举报
回复
不错,简要介绍一下思路如何?
都市夜猫 2008-10-17
  • 打赏
  • 举报
回复
改一下算法试试,记得 ms 不推荐在 sql 语句中使用 udf:

select min(hm), sum(sl), id from ( ;
select hm, sl, ;
(2^(asc(left(hm,1))-47)+2^(asc(substr(hm,2,1))-47)+2^(asc(substr(hm,3,1))-47))*;
asc(left(hm,1))*asc(substr(hm,2,1))*asc(substr(hm,3,1)) as id ;
from tt) as tmp ;
group by id order by 1 into cursor result

WWWWA 2008-10-17
  • 打赏
  • 举报
回复
对,思路就如前面所说,分拆字符串,按小->大排序,再分组,用数组排序是最快的
都市夜猫 2008-10-17
  • 打赏
  • 举报
回复
知道错在哪了,2^1+2^1+2^5 == 2^2+2^4+2^4,没考虑串中有相同字符的问题!
WWWWA 2008-10-17
  • 打赏
  • 举报
回复
比如115 应该为10,你的为17
WWWWA 2008-10-17
  • 打赏
  • 举报
回复
呵呵,是这样,不过结果也不正确,比如115 应该为10,你的为14,记录条数也少了
都市夜猫 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 WWWWA 的回复:]
且只对数字有效,FOXER的应该是最精简的了。
[/Quote]
不会吧?! 任何字符都会有不同的 ascii 值 n,照说取 2^n1 + 2^n2 + 2^n3 之和应该能得出唯一的值啊?
WWWWA 2008-10-17
  • 打赏
  • 举报
回复
且只对数字有效,FOXER的应该是最精简的了。
WWWWA 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 dkfdtf 的回复:]
不知道这样结果怎样,速度如何:

select min(号码), sum(数量) from ( ;
select 号码, 数量, ;
2^(asc(left(号码,1)))+2^(asc(substr(号码,2,1)))+2^(asc(substr(号码,3,1))) as id ;
from tt) as tmp ;
group by id order by 1

源数据太多,要转成测试源需要点耐心,最好直接贴成 create cursor ... 和 insert into ... 这样,直接复制过来就可以测试了。



[/Quote]
不行哦,只有184条记录,应该有219条记录
都市夜猫 2008-10-17
  • 打赏
  • 举报
回复
不知道这样结果怎样,速度如何:

select min(号码), sum(数量) from ( ;
select 号码, 数量, ;
2^(asc(left(号码,1)))+2^(asc(substr(号码,2,1)))+2^(asc(substr(号码,3,1))) as id ;
from tt) as tmp ;
group by id order by 1

源数据太多,要转成测试源需要点耐心,最好直接贴成 create cursor ... 和 insert into ... 这样,直接复制过来就可以测试了。


adyyadyy 2008-10-17
  • 打赏
  • 举报
回复
真是受用啊
wwwwb 2008-10-16
  • 打赏
  • 举报
回复
VFP没有MYSQL的GROUP_CONCAT函数,否则速度更快,主要慢在将分拆的字符串按小->大排序后再连接
这个步骤。
wwwwb 2008-10-16
  • 打赏
  • 举报
回复
结果也有问题,比如 000 为4,FOXER为66
wwwwb 2008-10-16
  • 打赏
  • 举报
回复
我的代码测试,结果有219条记录,FOXER的只有30条记录
用楼主第二次给出的记录来测试
wwwwb 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 apple_8180 的回复:]
Foxer的方法不错。一句就可以。
[/Quote]
呵呵,测试过代码吗?115就没有
wwwwb 2008-10-16
  • 打赏
  • 举报
回复
谢谢大家帮忙想问题,但我尝试了大家的方法,但都有点问题,我现将我要整理的数据给大家,请大家尝试一下正确与否,如果正确,一定给我说说改动后的语句,谢谢~

我用我的代码测试,比如115 SL为10
你的答案?
wwwwb 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 Foxer 的回复:]
另外需要着重说明一下,这种方法不具有普适性,可以适当的使用。

原因是
VAL(SYS(2007, LEFT(号码, 1))) + VAL(SYS(2007, SUBSTR(号码, 2, 1))) + VAL(SYS(2007, RIGHT(号码, 1)))
这个表达式并不是一定是唯一值,只是在这个例子能够保证其唯一性。

[/Quote]
是这样,发觉在VFP中很少有人使用标准的SQL语句来解决问题
加载更多回复(25)

2,726

社区成员

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

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