想了N久也做不来

linzhongde 2004-05-08 10:46:44
有一个成绩表(学科量不定)如下:

学生 语文 数学 英语 化学 ...
李 60 30 70 23
陈 20 30 60 50 ...
王 49 80 34 90 ..
...
现在要计算得到以下数据:
任2科(或3科或4科)不及格的人数?

如果只计算1科我可以这样用 :where 语文<60 or 数学 <60 or ...
现在要计算 任2科(或3科或4科)不及格,还真弄不来!
...全文
53 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
onlineboy 2004-05-12
  • 打赏
  • 举报
回复
或者
Select * From 成绩 Where Int(语文/60)+Int(数学/60)+Int(英语/60)+Int(物理/60)+Int(化学/60)+Int(生物/60)=n
n为及格科目
coffeemay 2004-05-12
  • 打赏
  • 举报
回复
首先定义一个共有变量 public unpasscount() as integer
public sub Getunpass()
redim preserve unpasscunt(0) as integer
dim DBCon As New ADODB.Connection
dim DBRst As New ADODB.Recordset
DBCon.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " + IIf(Right(App.Path, 1) = "\", App.Path, App.Path + "\") + "Data.mdb"
DBCon.open
DBRst.open "select * from Table", DBCon, 1, adLockOptimistic, adCmdText
if not dbrst.eof and dbrst.bof then
do whiel not dbrst.eof
dim i as integer,unpass as integer
for i=0 to dbrst.RecordCount-1
if dbrst(i)<60 then
unpass=unpass+1
end if
if ubound(unpass)<unpass
redim preserve unpasscount(unpass) as integer
unpasscont(unpass)=unpasscount(unpass)+1
end if
next i
dbrst.movenext
loop
dbcon.close
dbrst.close
end sub
显示结果:
public sub showunpass()
dim i as integer
for i= 1 to ubound(unpasscount)
print "有"&cstr(i) &"门不及格的人数为:" &cstr(unpasscount(i))
next i
end sub
没测试!应该没有特别严重的错误吧
pigsanddogs 2004-05-12
  • 打赏
  • 举报
回复
偶只知道狂转四圈+BC,运气好可以发出[天霸封神斩]...
pigsanddogs 2004-05-11
  • 打赏
  • 举报
回复
up
lsftest 2004-05-11
  • 打赏
  • 举报
回复
答复lsftest():“\”是整除运算符,a\b等同于int(a/b)
在此处,如果a>=60,则(a+40)\100=1,否则(a+40)\100=0
===========================
这个我知道,但你的语句有没有测试过???我在access中直接用你的语句进行查询得到的结果恐怕并非楼主想要的。。
另外,我也没有细心看题,楼主要的是人数。。。所以我的语句修改如下:

SELECT count(*) as 人数
FROM 成绩
WHERE (((IIf([成绩]![语文]>=60,0,1)+IIf([成绩]![数学]>=60,0,1)+IIf([成绩]![英语]>=60,0,1)+IIf([成绩]![物理]>=60,0,1)+IIf([成绩]![化学]>=60,0,1))=3));

跟我之前发过那张帖的语句不同,现在修改过后得出的人数就直接是不及格的人数了,如果想知道这部分人的详细信息,用下面的:
SELECT *
FROM 成绩
WHERE (((IIf([成绩]![语文]>=60,0,1)+IIf([成绩]![数学]>=60,0,1)+IIf([成绩]![英语]>=60,0,1)+IIf([成绩]![物理]>=60,0,1)+IIf([成绩]![化学]>=60,0,1))=3));

如果想改变查询不及格的科目数,修改上面那个3字为你想要的科目数就是了。。。

上面的语句在vb6+sp5+access+xp下通过,如果要在sql server中使用,由于sql server中没有iif语句,所以要用select case.....when..语句来代替。。。。
flyingZFX 2004-05-11
  • 打赏
  • 举报
回复
别用SQL了
还是用ADO吧,

一条条的去累加吧,

唉,估计速度和执行上的SQL没有什么区别吧,
RUKYO 2004-05-11
  • 打赏
  • 举报
回复
不好意思,没有看清,你要的是任2科(或3科或4科)不及格的人数,更正:

Select COUNT(*) From 成绩表 Where NOT(NOT(语文>59 AND 数学<60 AND 英语<60 AND 化学<60) AND NOT(语文<60 AND 数学>59 AND 英语<60 AND 化学<60) AND NOT(语文<60 AND 数学<60 AND 英语>59 AND 化学<60) AND NOT(语文<60 AND 数学<60 AND 英语<60 AND 化学>59) AND NOT(语文<60 AND 数学<60 AND 英语<60 AND 化学<60))
RUKYO 2004-05-11
  • 打赏
  • 举报
回复
效率极低:
Select * From 成绩表 Where NOT(语文>59 AND 数学<60 AND 英语<60 AND 化学<60) AND NOT(语文<60 AND 数学>59 AND 英语<60 AND 化学<60) AND NOT(语文<60 AND 数学<60 AND 英语>59 AND 化学<60) AND NOT(语文<60 AND 数学<60 AND 英语<60 AND 化学>59) AND NOT(语文<60 AND 数学<60 AND 英语<60 AND 化学<60)
flyingscv 2004-05-11
  • 打赏
  • 举报
回复
如果是100分的卷子
用上面的不如写成 select * from 成绩 where {(语文+40)-40}\(100-40)...,是不是更好理解,呵呵
onlineboy 2004-05-11
  • 打赏
  • 举报
回复
答复lsftest():“\”是整除运算符,a\b等同于int(a/b)
在此处,如果a>=60,则(a+40)\100=1,否则(a+40)\100=0
lsftest 2004-05-11
  • 打赏
  • 举报
回复
可以用变通的方法,如
Select 及格科数=(语文+40)\100+(数学+40)\100+(英语+40)\100+(物理+40)\100+(化学+40)\100 From 成绩
==============================
思路和方法都是非常的好。。。但我想楼主想要的应该是这样:
select * from 成绩 where (语文+40)\100+(数学+40)\100+(英语+40)\100+(物理+40)\100+(化学+40)\100=1
上面的语句也是一种变通方法,其实是选出只有一科合格的人,就是相当于任3科不及格的人。。
如果要直接得出任3科不及格的人,语句还需要修改一下。。。

其他任2科、任1科合格(或不及格)的查询原理基本相同。。。。。
flyingscv 2004-05-11
  • 打赏
  • 举报
回复
Select COUNT(*) From 成绩表 Where NOT(NOT(语文>59 AND 数学<60 AND 英语<60 AND 化学<60) AND NOT(语文<60 AND 数学>59 AND 英语<60 AND 化学<60) AND NOT(语文<60 AND 数学<60 AND 英语>59 AND 化学<60) AND NOT(语文<60 AND 数学<60 AND 英语<60 AND 化学>59) AND NOT(语文<60 AND 数学<60 AND 英语<60 AND 化学<60))

-----------------------------------

这个效率应该不低
lzj34 2004-05-11
  • 打赏
  • 举报
回复
这样把这个结果再生成一张临时表就可以简单的查出来了
lzj34 2004-05-11
  • 打赏
  • 举报
回复
楼上的这个方法不错
onlineboy 2004-05-11
  • 打赏
  • 举报
回复
可以用变通的方法,如
Select 及格科数=(语文+40)\100+(数学+40)\100+(英语+40)\100+(物理+40)\100+(化学+40)\100 From 成绩
ryuginka 2004-05-11
  • 打赏
  • 举报
回复
学习
openforever 2004-05-11
  • 打赏
  • 举报
回复
同意楼上的.
RUKYO 2004-05-11
  • 打赏
  • 举报
回复
回复人: onlineboy(stame)
可以用变通的方法,如
Select 及格科数=(语文+40)\100+(数学+40)\100+(英语+40)\100+(物理+40)\100+(化学+40)\100 From 成绩
------------------------------------------------------------------------------
是呀,我怎么想不到呢?

Huaraco 2004-05-11
  • 打赏
  • 举报
回复
=============
不好意思,没有看清,你要的是任2科(或3科或4科)不及格的人数,更正:

Select COUNT(*) From 成绩表 Where NOT(NOT(语文>59 AND 数学<60 AND 英语<60 AND 化学<60) AND NOT(语文<60 AND 数学>59 AND 英语<60 AND 化学<60) AND NOT(语文<60 AND 数学<60 AND 英语>59 AND 化学<60) AND NOT(语文<60 AND 数学<60 AND 英语<60 AND 化学>59) AND NOT(语文<60 AND 数学<60 AND 英语<60 AND 化学<60))
--------------

starsoulxp 2004-05-11
  • 打赏
  • 举报
回复
自定义一个类型看看,或者用collection
加载更多回复(4)

7,762

社区成员

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

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