怎样进行分组统计

luhongjun 2001-08-03 11:54:18
加精
在表中有两个字段F1、F2,F1字符类型,F2数值类型。怎样按F1的头一个字母,头两个字母.....和所有字母进行分组统计。
例如:

F1 F2
A010010 4
A010010 5
A010011 1
A011111 3
A011112 1
B010000 1
B100100 1
取F1的第一位分组统计
结果为:
F1 F2
如果按一位分组统计: A 5 14
B 2 2

按两位:
F1 F2
如果按一位分组统计: A0 5 14
B0 1 1
B1 1 1
以此类推.....

求分组统计的算法。
按三个,四个......
写一段程序实现.

...全文
695 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
luhongjun 2001-08-08
  • 打赏
  • 举报
回复
给分
yuyulily 2001-08-06
  • 打赏
  • 举报
回复
想各位学习!
wjzhuang 2001-08-06
  • 打赏
  • 举报
回复
我的意思就是在判断字符串是否符合时候,大家的一个前提就是字符串的情况是理想的,而考虑的字符串匹配也是根据这个前提.
但是不妨扩展成:从字符串中找出符合某个条件的字符,这时候就需要用到一些匹配算法
Wingsun 2001-08-06
  • 打赏
  • 举报
回复
在数据库中建立一个可以传递参数的视图或者存储过程即可,这种工作最好有数据库端来完成,何必自己写算法呢?
毕竟它和数据库的关系太大了。
孩皮妞野 2001-08-06
  • 打赏
  • 举报
回复
精彩纷呈。

你会发现,使用SQL语句有最高的效率--不是Holyfire的算法不够精妙,在应用和数据库系统之间
的数据传递通常是个很重要的瓶颈。

所以, 我的估计是, 你自己给出了正解,

select left(f1, number), count(*), sum(f2)
from tmp
group by left(f1, number)


Access有丰富的内建函数,如果了解一点VB会占很大便宜。
holyfire 2001-08-06
  • 打赏
  • 举报
回复
struct Result{
AnsiString Name;
WORD Count;
};

class FindOption{
protected:
Result res;
public:
virtual BOOL HasFound( AnsiString const& arg )=0;
};

class NOption:public FindOption{
public:
NOption( AnsiString const& Key , WORD Number )
{
res.Count = 0;
if( Key != "" && Key.Length() > Number )
{
res.Name = Key.SubString( 0 , Number );
res.Count = 1;
}
}
virtual BOOL HasFound( AnsiString const& arg )
{
if( arg !="" && res.Name == arg.Key.SubString( 0 , 1 ) )
{
res.Count ++;
return true;
}
return false;
}
};

大家有没有发现,这样一改,立刻又通用于好多字符的情况了

呵呵

设计思想还是比较重要的。
yuyulily 2001-08-06
  • 打赏
  • 举报
回复
up
yuyulily 2001-08-06
  • 打赏
  • 举报
回复
select left(f1, number), count(*), sum(f2)
from tmp
group by left(f1, number)
中的number怎么在程序中用参数传递?

书生 2001-08-05
  • 打赏
  • 举报
回复
我昨天和今天就这个问题问过了两个同事,呵呵,他们都比我会。不过还是同意我的方法,那就是牺牲内存,使用链表和结构,将数据倒进内存中进行处理但是前提当然是记录量不能太大了,否则光是数据的提取就有问题。
guo 2001-08-05
  • 打赏
  • 举报
回复
昨天晚上我又想了一下感觉纯程序的处理显然会比sql速度要快,但有没有考虑到这一点对于小型的数据库,较小的数据量还不错,但是如果有数千万条怎么办? 可以最终汇总10,100条都很难说,这个数据量的问题怎么处理? 按照几位的方法,将数千万条先取回,但数据量怎么样各位可想而知了.
我总体的认识是什么样的问题用什么样的方法,对于数据库不支持时当然要用程序实现,但如果数据库系统支持,为什么不用呢?
luhongjun 2001-08-05
  • 打赏
  • 举报
回复
guo(到底想要什么?):请到http://www.csdn.net/expert/topic/224/224699.shtm取分.
此问题共400分.
luhongjun 2001-08-05
  • 打赏
  • 举报
回复
写错了改正:
在ACCESS下使用SQL的解决方法是:
select left(name,NUMBER),count(*),sum(num) from test group by left(name,NUMBER)

在ACCESS中包括left函数,在BCB5+ADO+ACCESS200下通过。

holyfire(狐狸发),lluunn007(玉笛书生)的方法我正在测试,马上给结果。

wjzhuang(痛苦中的程序猪):请仔细说说。

大家继续。



luhongjun 2001-08-05
  • 打赏
  • 举报
回复
在ACCESS下使用SQL的解决方法是:
select left(name,NUMBER),count(*),sum(num) from test group by substring(name,NUMBER)

在ACCESS中包括left函数,在BCB5+ADO+ACCESS200下通过。

holyfire(狐狸发),lluunn007(玉笛书生)的方法我正在测试,马上给结果。

wjzhuang(痛苦中的程序猪):请仔细说说。

大家继续。


wjzhuang 2001-08-05
  • 打赏
  • 举报
回复
看了上面的回复,我觉得在字符串的判断是否简单化了
项羽老大的意思是判断是不是有一样的字符子串,不见得又规律
这时候需要模式匹配算法(KMP或者Boyer-Moore)
wolfboy 2001-08-04
  • 打赏
  • 举报
回复
对呀,要不就建一个计算字段
其字段值=FTalbe->FieldByName(F1)->AsString.SetLength(4);

只是不能动态改变统计的长度
书生 2001-08-04
  • 打赏
  • 举报
回复
呵呵,如你所说,实现不难,但是要想算法写的好就得好好琢磨了。我回去能上机再说
闪了
luhongjun 2001-08-04
  • 打赏
  • 举报
回复
此问题只是简单的实现并不难,难在有个好的算法.
最好做成一个公用函数.
就象VFP里的TOTAL
luhongjun 2001-08-04
  • 打赏
  • 举报
回复
guo主要是我做的项目使用access2000做数据库.所以不能用SubString函数.
guo 2001-08-04
  • 打赏
  • 举报
回复
呵呵,我可没有考虑什么算法,只是现在看到表就想到sql语句,数据库搞多了也就什么都想用SQL实现.
关于一趟算法的问题我感觉最彻底的办法就是游标加临时表,当然所以数据库都适用是不可能的了.
我不是科班出身的,对算法没有研究过,曾经看过一次数据结构算法的书,看了几天都没有理出头绪,弄的我半年没兴趣搞计算机.

也期望自己的有一天能有各位高手的数据结构算法水平,但更可能的是要往DBA转了,搞技术的很累.
wangledong 2001-08-04
  • 打赏
  • 举报
回复
要想提高速度我的经验是牺牲内存!如果数据量不是很大的化可以考虑用数组,从数据库选出记录(一定要按F1排序),然后放到TList中,然后编一个折半查找函数从TList中查找就好了,很简单,但速度很快!.
加载更多回复(35)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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