| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1879 人关注过本帖
标题:表中只有某二列相同(报名序号,姓名工)其它都不相同的重复记录,我想把只 ...
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
vfp9帮助文件:
在 FROM 子句中的子-SELECT

一个子-SELECT 常常引用到做为一个衍生数据表。衍生数据表是引用一个别名或用户指定名称在 FROM 子句中的 SELECT 语句。在 FROM 子句中的 SELECT 的结果集通过使用外部 SELECT 语句来建立一个数据表。Visual FoxPro 9.0 提供了在一个 FROM 子句中使用子查询。

一个子-SELECT 应该被包含在括号中而且需要一个别名。不支持相互关联。一个子-SELECT 与 SELECT 命令有相同的语法限制,但子查询就没有此语法限制。在最上层 SELECT 计算之前会执行所有的子-SELECT。

下面是在 FROM 子句中子查询的一般语法。

SELECT … FROM (SELECT …) [AS] Alias…
根据上述
SELECT bmd,COUNT(*) FROM (select DISTINCT bmxh,bmd FROM xk
) GROUP BY bmd 
括号内不是子查询吗?主查询的表来自从子查询结果的表,为什么不行?

2015-09-25 08:41
kinvanhon
Rank: 5Rank: 5
来 自:战争学院
等 级:贵宾
威 望:16
帖 子:99
专家分:258
注 册:2014-10-7
收藏
得分:3 
一个子-SELECT 应该被包含在括号中而且需要一个别名
看清楚你的别名在哪里
2015-09-25 08:45
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
以下是引用kinvanhon在2015-9-25 08:45:45的发言:

一个子-SELECT 应该被包含在括号中而且需要一个别名
看清楚你的别名在哪里
现加了,是不是这样?如何理介?
SELECT bmd,COUNT(*) FROM (select DISTINCT bmxh,bmd FROM xk) as a GROUP BY bmd
2015-09-25 08:56
沙枣
Rank: 4
来 自:宁夏银川
等 级:业余侠客
威 望:5
帖 子:103
专家分:221
注 册:2015-5-31
收藏
得分:3 
回复 楼主 sylknb
    你所提的问题,实际上是“分类统计”的范畴,我有一程序,能够以任意多个字段为统计条件组合,分别统计出每个分类的记录个数,具有高度的通用性,可用于任何数据库,进行反复多轮次的分类统计工作。
    使用方法:VFP下打开数据表,do 程序1,在字段列表中按顺序选择你要的字段组合(如你要的人员编号、姓名),“选择结束”退出字段选择后,即可看到统计结果。
    SQL与运行环境、版本都有些关系,难于做出高度通用的程序。


*本程序用于分类统计,lstran记录的结果可能存在分类字段排列顺序不正确的问题.
private all
set escape off
set talk off
set scoreboard off
set status off
set safety off
set exact on
jgzdh=1
do while jgzdh<=fcount(1)
if upper(field(jgzdh))="FL_TJGS".or.field(jgzdh)="总体".or.field(jgzdh)="统计结果".or.field(jgzdh)="百分比".or.field(jgzdh)="轮次"
set color to +7/1
clear
jhh=1
do while jhh<=len(dbf(1))
if left(right(dbf(1),jhh),1)<>"\"
jhh=jhh+1
else
gdhh=lower(right(dbf(1),jhh-1))
exit
endif
enddo
gdhh="["+gdhh+"]库有["+field(jgzdh)+"]字段,不能运行本程序."
wait gdhh window at 16,(120-len(gdhh))/2 nowait
tdsj=inkey(1)
wait clear
return
endif
jgzdh=jgzdh+1
enddo
set color to +7/1,+6/4
clear
if upper(right(dbf(1),10))="LSTRAN.DBF"
wait "不能在LSTRAN库中运行本程序" window at 16,51 nowait
tdsj=inkey(1)
wait clear
return
endif
yskm=dbf(1)
copy to bjk-ext structure extended
use
messagebox("附加统计条件可改变百分比计算基数,"+CHR(13)+"多轮统计分类关键字应由细类到大类.",0,"综合分类统计")
use bjk-ext
append blank
replace field_name with "总体"
replace field_len with 10
replace field_type with "Number"
replace field_dec with 0
append blank
replace field_name with "统计结果"
replace field_len with 10
replace field_type with "Number"
replace field_dec with 0
append blank
replace field_name with "百分比"
replace field_len with 10
replace field_type with "Number"
replace field_dec with 2
append blank
replace field_name with "轮次"
replace field_len with 10
replace field_type with "Number"
replace field_dec with 0
append blank
replace field_name with "fl_tjgs"
replace field_len with 30
replace field_type with "Character"
replace field_dec with 0
create lszlpxk1 from bjk-ext
use
sma=30
dhzd1=""
tjcsz=space(126)
if file(yskm)
use &yskm
dimension name1(300),jgfh(300),meti(300)
qxh=1
do while qxh<=fcount()
store space(5)+field(qxh)+space(13-len(field(qxh))) to meti(qxh)
qxh=qxh+1
enddo
store space(5)+"选择结束"+space(5) to meti(qxh)
use
else
clear
wait "数据库不存在,退出." window at 16,50 nowait
tdsj=inkey(1)
use
set color to +7/1
clear
return
endif

qxh=1
zd=1
ydlh1=1
jhdh1=1
csm=1
whxh=1
jhh=1
do while whxh<>7
set color to +7/1,+6/4
clear
use &yskm
@22,5 say "PgUp键上页    PgDn键下页   ↑键上一字段   ↓键下一字段    Enter键确认"
@2,8.7 clear to 21,30
@2,47 clear to 21,68
set color to +7/6
@2,8.7 clear to 21,30
@2,47 clear to 21,68
@2,8.7 to 21,30
@2,47 to 21,68
@3,12 say "请选择统计字段"
@3,52 say "选中的字段有"
set color to +7/3,+6/4
@5,10 clear to 20.4,28.7
store 1 to pk
store space(10) to name1
store "," to jgfh
cxhh=1
if fcount()>14
if qxh>15
do while ydlh1<=qxh
if ydlh1=qxh
@cxhh+4,10 prompt meti(ydlh1)
else
@cxhh+4,10 say meti(ydlh1)
endif
cxhh=cxhh+1
ydlh1=ydlh1+1
enddo
else
do while ydlh1<=15
if ydlh1=jhdh1
@cxhh+4,10 prompt meti(ydlh1)
else
@cxhh+4,10 say meti(ydlh1)
endif
cxhh=cxhh+1
ydlh1=ydlh1+1
enddo
endif
else
do while ydlh1<=fcount()+1
if ydlh1=jhdh1
@cxhh+4,10 prompt meti(ydlh1)
else
@cxhh+4,10 say meti(ydlh1)
endif
cxhh=cxhh+1
ydlh1=ydlh1+1
enddo
endif
keyboard chr(13)
menu to jhdh1

do while .t.
anke=inkey(0)
do case
case anke=5.and.qxh>1.and.qxh<=fcount()+1
qxh=qxh-1
case anke=5.and.qxh=1
qxh=fcount()+1
case anke=24.and.qxh>=1.and.qxh<fcount()+1
qxh=qxh+1
case anke=24.and.qxh=fcount()+1
qxh=1
case anke=3
if qxh+14<=fcount()+1
qxh=qxh+14
else
qxh=fcount()+1
endif
case anke=18
if qxh-14>=1
qxh=qxh-14
else
qxh=1
endif
endcase
if qxh>15
ydlh=qxh-14
jhdh=15
else
ydlh=1
jhdh=qxh
endif

cxhh=1
set color to +7/3,+6/4
@5,10 clear to 20.4,28.7
if fcount()>14
if qxh>15
do while ydlh<=qxh
if ydlh=qxh
@cxhh+4,10 prompt meti(ydlh)
else
@cxhh+4,10 say meti(ydlh)
endif
cxhh=cxhh+1
ydlh=ydlh+1
enddo
else
do while ydlh<=15
if ydlh=jhdh
@cxhh+4,10 prompt meti(ydlh)
else
@cxhh+4,10 say meti(ydlh)
endif
cxhh=cxhh+1
ydlh=ydlh+1
enddo
endif
else
do while ydlh<=fcount()+1
if ydlh=jhdh
@cxhh+4,10 prompt meti(ydlh)
else
@cxhh+4,10 say meti(ydlh)
endif
cxhh=cxhh+1
ydlh=ydlh+1
enddo
endif
keyboard chr(13)
menu to jhdh
zd=qxh
if zd<>fcount()+1.and.anke=13
csm=zd
endif

ozj=pk
sdh=0
do while ozj>=1
if field(zd)<>name1(ozj)
ozj=ozj-1
else
sdh=sdh+1
ozj=ozj-1
endif
enddo
set color to +7/6
if zd<>fcount()+1.and.sdh=0.and.anke=13
if type(field(zd))<>"L".and.type(field(zd))<>"M".and.type(field(zd))<>"G"
store field(zd) to name1(pk)
if pk<=15.and.anke=13
@pk+4,54 say trim(name1(pk))
endif
if pk>15.and.anke=13
vehp=pk-14
inhm=1
do while vehp<=pk
@inhm+4,54 say space(13)
@inhm+4,54 say trim(name1(vehp))
vehp=vehp+1
inhm=inhm+1
enddo
endif

pk=pk+1
else
set color to +7/1
@24,20 say "记忆型/逻辑型/通用型字段不能作为统计条件"
endif
endif
if zd=fcount()+1.and.anke=13
qxh=csm
if qxh>15
ydlh1=qxh-14
jhdh1=15
else
ydlh1=1
jhdh1=qxh
endif
exit
endif
set color to +7/1,+6/4
enddo
set color to +7/6
if zd=fcount()+1.and.anke=13.and.pk=1
@7,51 say "未 选 择 字 段"
@9,51 say "按第一个非L非G"
@11,51 say "和非M型字段为"
@13,51 say "统      件"
tdsj=inkey(1)
pkgd=1
do while pkgd<=fcount()
if type(field(pkgd))<>"L".and.type(field(pkgd))<>"M".and.type(field(pkgd))<>"G"
store field(pkgd) to name1(pk)
pk=pk+1
qxh=pkgd
if qxh>15
ydlh1=qxh-14
jhdh1=15
else
ydlh1=1
jhdh1=qxh
endif
exit
endif
pkgd=pkgd+1
enddo
endif

num=pk
dhzd=""
pk=1

if num=1
set color to +7/6
@5,49 clear to 19,67
@7,52 say "未找到合法的"
@9,52 say " 统计关键字"
@11,52 say " 退      出"
tdsj=inkey(2)
use
erase bjk-ext.dbf
erase bjk-ext.fpt
erase lszlpxk1.dbf
erase lszlpxk1.fpt
set color to +7/1
clear
return
else
jgfh(num-1)=""
do while pk<num
dhzd=dhzd+name1(pk)+jgfh(pk)
if upper(left(dhzd1,at(",",dhzd1)))<>upper(name1(pk)+",").and.(.not.(","+upper(name1(pk))+",")$upper(dhzd1))
dhzd1=dhzd1+name1(pk)+","
endif
pk=pk+1
enddo
endif
set color to +7/1
clear
define windows win1 from 2,8 to 28,92 system title "分类统计的记录范围" color scheme 1
activate windows win1
move windows win1 center
@1,1,23,13 box space(9)
@2,3 say "库 字 段"
@3,3 say "提    示"
@4,3 say "────"
xzds=1
do while xzds<=fcount().and.xzds<=18
@xzds+4,2 say field(xzds)
xzds=xzds+1
enddo
@9,38 say "请输入分类统计的附加条件"
@13,17 get tjcsz color ,+6/4
set cursor on
read
set cursor off
clear gets
release windows win1
clear
use
use bjk-ext
go bottom
if len(trim(tjcsz))+20>sma
replace field_len with len(trim(tjcsz))+20
create lsbjczk from bjk-ext
append from lszlpxk1
copy to lszlpxk1
sma=len(trim(tjcsz))+20
else
if len(trim(tjcsz))+20>=30
replace field_len with len(trim(tjcsz))+20
else
replace field_len with 30
endif
endif
create lsbjczk from bjk-ext
if trim(tjcsz)<>""
clear
wait "统计范围:"+trim(tjcsz) window at 16,(126-len("统计范围:"+trim(tjcsz)))/2 nowait
tdsj=inkey(1)
append from &yskm for &tjcsz
wait clear
else
clear
wait "条件为空将默认全部" window at 16,50 nowait
tdsj=inkey(1)
append from &yskm
wait clear
endif
set color to +7/1,+6/4
clear
copy structure to lstran field &dhzd,总体,统计结果,百分比,轮次,fl_tjgs
jgzdh=messagebox("是否进行全库排序?",4+32+0,"记录排序")
if jgzdh=6
wait "正在进行分类排序" window at 16,48 nowait
tdsj=inkey(0.5)
sort to lsbjpxk on &dhzd
wait clear
else
wait "正在整理分类数据" window at 16,48 nowait
tdsj=inkey(0.5)
copy to lsbjpxk
wait clear
endif
use
clear
jlzzi=1
@5,25 say "正在进行分类统计"
@8,25 say "正在统计第"
@8,45 say "类数据"
use lsbjpxk
samtol=reccount(1)
jdt=25
go top
do while .not.eof()
@8,35 say str(jlzzi)

pk=1
do while pk<num.and.pk<10
nagdxs=name1(pk)
@9+pk,25 say name1(pk)+":"
@9+pk,35 say &nagdxs
pk=pk+1
enddo

pk=1
jgfh=""
do while pk<num
nagdxs=name1(pk)
store &nagdxs to jgfh(pk)
pk=pk+1
enddo

if .not.eof()
skip
endif

cfgsj=1
do while .not.eof()
pk=1
qdpdh=0
do while pk<num
pdnadh=name1(pk)
if &pdnadh<>jgfh(pk)
qdpdh=qdpdh+1
endif
pk=pk+1
enddo

if qdpdh=0
cfgsj=cfgsj+1
skip
else
exit
endif
enddo

if recno(1)>reccount(1)
gdhh=(recno(1)-1)*64.4/reccount(1)+25
@20,25 say "第["+ltrim(str(jlzzi))+"]类记录共"+ltrim(str(cfgsj))+"个,已完成:"+ltrim(str((recno(1)-1)*100/reccount(1),10,2))+"%    "
else
gdhh=recno(1)*64.4/reccount(1)+25
@20,25 say "第["+ltrim(str(jlzzi))+"]类记录共"+ltrim(str(cfgsj))+"个,已完成:"+ltrim(str(recno(1)*100/reccount(1),10,2))+"%    "
endif
do while jdt<=gdhh
set color to +6/1
@21,jdt to 22,90 pen 2
jdt=jdt+0.1
set color to +7/1
enddo
jdt=jdt-0.1
tdsj=inkey()
if eof(1)
tdsj=inkey(1)
endif

sele 2
use lstran
append blank
go bottom
pk=1
do while pk<num
tjzddh=name1(pk)
replace &tjzddh with jgfh(pk)
pk=pk+1
enddo
replace fl_tjgs with str(cfgsj)+"个"+str(int(cfgsj*10000/samtol+0.5)/100,10,2)+"%"
replace 统计结果 with cfgsj
replace 百分比 with int(cfgsj*10000/samtol+0.5)/100
replace 总体 with samtol
replace 轮次 with jhh
use
sele 1
jlzzi=jlzzi+1
enddo
sele 1
use
use lstran
append blank
if trim(tjcsz)<>""
replace fl_tjgs with "统计范围:"+trim(tjcsz)+"("+ltrim(str(samtol))+"条)"
else
replace fl_tjgs with "统计范围:所有库记录"+"("+ltrim(str(samtol))+"条)"
endif
replace 总体 with samtol
replace 统计结果 with samtol
replace 轮次 with jhh
if samtol>0
replace 百分比 with 100
else
replace 百分比 with 0
endif
go top
set color to +7/1,+6/4
clear
wait "以下是分类统计的结果" window at 16,52 nowait
tdsj=inkey(1)
brow
use
use lszlpxk1
append from lstran
use
set color to +7/1,+6/4
clear
whxh=messagebox("继续进行分类统计?",4+32+0,"数据统计")
jhh=jhh+1
enddo
jgzdh=messagebox("是否保留分类统计的注释信息?",4+32+0,"分类统计")
if jgzdh=6
dhzd1=dhzd1+"总体,统计结果,百分比,轮次,fl_tjgs"
if right(dhzd1,1)=","
dhzd1=left(dhzd1,len(dhzd1)-1)
endif
use lszlpxk1
copy to lstran field &dhzd1
else
dhzd1=dhzd1+"总体,统计结果,百分比,轮次"
if right(dhzd1,1)=","
dhzd1=left(dhzd1,len(dhzd1)-1)
endif
use lszlpxk1
delete all for "范围"$fl_tjgs
if upper(right(yskm,10))<>"LSDELE.DBF"
copy to lsdele for deleted()
endif
pack
copy to lstran field &dhzd1
endif
use lstran
messagebox("历次统计结果存于LSTRAN.DBF库,进行后续数据处理?",0,"分类统计")
use &yskm
erase bjk-ext.dbf
erase bjk-ext.fpt
erase lsbjczk.dbf
erase lsbjczk.fpt
erase lsbjpxk.dbf
erase lsbjpxk.fpt
erase lszlpxk1.dbf
erase lszlpxk1.fpt
set color to +7/1
clear
return


[ 本帖最后由 沙枣 于 2015-9-25 10:25 编辑 ]
2015-09-25 10:22
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
运行此句  use &yskm 提示错误
没有出现:在字段列表中按顺序选择你要的字段组合(如你要的人员编号、姓名)的列表,一闪而过。lszlpxk1.DBF中是空内容

[ 本帖最后由 sylknb 于 2015-9-25 12:50 编辑 ]
2015-09-25 12:41
沙枣
Rank: 4
来 自:宁夏银川
等 级:业余侠客
威 望:5
帖 子:103
专家分:221
注 册:2015-5-31
收藏
得分:0 
回复 15楼 sylknb
这可能是你使用的方法不对,数据库文件的路径中不要含“空格”(如在桌面上使用),另外要先打开数据库,再运行程序,我测试没问题。
2015-09-25 14:12
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
我在D:\,
是数据表(dbf)还是数据库?
2015-09-25 16:16
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
我试了一下,成了,但在附加条件中如何输入要求?例如1个人报了多名课,则有重复的报名号,在统计人数中只要统计人数,不要统计课次,哪附加条件如何输入?

[ 本帖最后由 sylknb 于 2015-9-25 16:30 编辑 ]
2015-09-25 16:28
沙枣
Rank: 4
来 自:宁夏银川
等 级:业余侠客
威 望:5
帖 子:103
专家分:221
注 册:2015-5-31
收藏
得分:0 
回复 18楼 sylknb
输入统计条件只是为了限定统计的范围,在数据表很庞大时可以减轻电脑的压力,当然也会改变统计百分比的基数(如全校500人,如果不附条件则以500为百分比计算基数,如果限定为某一个班,则以这个班的总人数为百分比计算基数)。如果统计全部数据就没必要限制条件。限定条件可以是任何合法的VFP表达式,由当前数据表的字段及其表达式构成,如:
班级="高一三班"

班级="高一三班".and.学校="赵保中学"等等皆可,视实际需要取用。

只统计人数,而不统计课名,则在字段选择时选姓名或编号+姓名进行分类统计就行了,多试几下,你就会用了。

[ 本帖最后由 沙枣 于 2015-9-25 16:50 编辑 ]
2015-09-25 16:40
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
我的意思多个相同的报名序号只取一个,只想统计有多少人报名(也就去掉重复),不想统计报多少课次
bmxh     xm     km
51016001 张三    语文
51016001 张三    数学
51016002 李四    语文
51016002 李四    物理
51016002 李四   化学
。。。。

[ 本帖最后由 sylknb 于 2015-9-25 16:51 编辑 ]
2015-09-25 16:49
快速回复:表中只有某二列相同(报名序号,姓名工)其它都不相同的重复记录,我想 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025072 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved