注册 登录
编程论坛 ASP技术论坛

有关统计的问题

zhongx 发布于 2007-08-20 00:17, 871 次点击
问题要求:
总体上把以下的数据库中的这些字段读出并显示在页面:
id A B C D E F
关键处:
1.全部数据库id中A字段与A字段及C字段与C字段比较后 不相同 的作各自显示。
2.全部数据库id中A字段与A字段及C字段与C字段比较后 相同 的合并为一条显示,
因为相同所以A B C D E 取其一即可,但需要 F 的数全部相加后一并显示。
19 回复
#2
ayue2222007-08-20 09:28
select * from id as i where A in (select top 1 A from id where A=i.A and C=i.C) //这句大概只能做到1、2俩条件 。。因为没有进行具体的 测试 。。。。不知道满不满足要求。。请zhongx朋友自行修改、测试一下吧 。。。
#3
ayue2222007-08-20 09:44

F值的和的显示不知道是这么显示法 .... 能不能用具体的 数据例子说明一下...

#4
zhongx2007-08-20 13:27
以下是引用ayue222在2007-8-20 9:44:11的发言:

F值的和的显示不知道是这么显示法 .... 能不能用具体的 数据例子说明一下...

只有本站会员才能查看附件,请 登录


偶简单的做了个页面,运行没有错,只是功能实现不了.
你看看明不明白,可能你理解为字段A和字段B相同时合并成一条数据显示在页面.
想实现的功能:
当字段A和其他数据的字段A及字段B和其他数据的字段B相同时能否合并成一条数据显示在页面?
#5
ayue2222007-08-20 15:20

<%
dim conn,mdbfile
mdbfile=server.mappath("0.mdb")
set conn=server.createobject("adodb.connection")
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=;dbq="&mdbfile
%>

<html>
<head>
<title>统计测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<head>

<body>

<%
set rs=server.CreateObject("adodb.recordset")
sql="select id,a,b,c,d,e,f from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)"
response.write sql
rs.Open sql,conn,1,1
%>

<table>
<tr>
<td>字段A</td><td>字段B</td><td>字段C</td><td>字段D</td><td>字段E</td><td>字段F</td>
</tr>
<% do while Not rs.eof %>
<tr>
<td><%=rs(1)%></td>
<td><%=rs(2)%></td>
<td><%=rs(3)%></td>
<td><%=rs(4)%></td>
<td><%=rs(5)%></td>
<td><%set rs1=conn.execute ("select sum(f) from [id] where A="&rs(1)&" and B="&rs(2)):response.write rs1(0)%></td>
</tr>
<%
rs.movenext
loop
%>
</table>

</body>
</html>

一行SQL语句貌似达不到你的要求 ...这个是我在你给的代码的基础上改的 ...基本达到了你的要求 ..

[此贴子已经被作者于2007-8-20 15:50:57编辑过]

#6
zhongx2007-08-20 19:41

看你现在的写法,我知道你已完全明白我的意思,先谢过!
====================================================================================================
现在的经过多次测试发现有这样的问题:
1.select id,a,b,c,d,e,f from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)
这段代码显示到了页面.<我看不出错在那里>
2.计算F的结果出错未能算出结果.
出错信息:
Microsoft OLE DB Provider for ODBC Drivers '80040e07'

[Microsoft][ODBC Microsoft Access Driver] 标准表达式中数据类型不匹配。

\wwwroot\0.asp, line 34
=====================================================================================
ayue222朋友有解决的方法吗?
=====================================================================================
前面的功能已经成功了.
=====================================================================================

#7
zhongx2007-08-20 20:07
---------------------------------------------------------------------------------------------------
select id,a,b,c,d,e,f from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)
---------------------------------------------------------------------------------------------------
select * from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)
---------------------------------------------------------------------------------------------------

我想问一下在这里二种写法有何不同呢?
本人理解为前者是指定后者是所有,
测试结果几乎一样.
#8
ayue2222007-08-21 09:00
以下是引用zhongx在2007-8-20 20:07:09的发言:
---------------------------------------------------------------------------------------------------
select id,a,b,c,d,e,f from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)
---------------------------------------------------------------------------------------------------
select * from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)
---------------------------------------------------------------------------------------------------

我想问一下在这里二种写法有何不同呢?
本人理解为前者是指定后者是所有,
测试结果几乎一样.

这 2句在这里是没有区别的 ... 第一句不过是进行了精确输入而已..

我不明白你说的错误是什么 ... 不过 ...我把第一个查询输出加上了条件判断...也加多了几条数据进行测试 ...貌似没有出现错误,如果你那有错误请说出具体的报错信息.. 下面是关键代码: 数据库0.mdb,表名:ID,表字段:id(自动递增),A,B,C,D,E,F 都为(int)类型

<%
set rs=server.CreateObject("adodb.recordset")
sql="select * from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)"
response.write sql
rs.Open sql,conn,1,1
%>

<table>
<tr>
<td>ID</td><td>字段A</td><td>字段B</td><td>字段C</td><td>字段D</td><td>字段E</td><td>字段F</td>
</tr>
<%
if not (rs.bof and rs.eof) then
do while Not rs.eof %>
<tr>
<td><%=rs("id")%></td>
<td><%=rs("A")%></td>
<td><%=rs("B")%></td>
<td><%=rs("C")%></td>
<td><%=rs("D")%></td>
<td><%=rs("E")%></td>
<td><%set rs1=conn.execute ("select sum(f) as ff from [id] where A="&rs("A")&" and B="&rs("B")):response.write rs1("ff")%></td>
</tr>
<%
rs.movenext
loop
end if
rs.close:set rs=nothing
%>
</table>

#9
zhongx2007-08-21 15:01

今次测试没有错误了,但是不知何解下面这句显示到了页面上:
select * from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)
一般来说这句在ASP的 起止符 <% %> 内是不会显示在页面的,
百思不得其解它现在显示在页面了?

#10
ayue2222007-08-21 15:46
<%
set rs=server.CreateObject("adodb.recordset")
sql="select * from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)"
response.write sql
rs.Open sql,conn,1,1
%>

...偶测试的时候输出的这个SQL语句进行查看 ...把红色代码删除或者屏蔽就好了 ...
#11
zhongx2007-08-21 19:05

呵呵!
我有事出去了,边开车边想着这个问题,想到了尝试把这句删除,
回来看看你已解决了问题,经测试完全达到了所想效果!!!
非常感谢ayue222朋友!!!!!!!!!!
至此这个问已圆满解决!
相信路过走过有心和没有心看贴的都从ayue222朋友的解答中学到不少知识了.
本人认为从样例中学习ASP比较轻松和易于上手,
但需要基础和举一反三多思考......
这只不过是本人认为而已,
其他人如有更好的方法那就按更好的方法去学习吧!
我看到看此贴的人也不少,所以在此说这些话想鼓励一下想学习ASP的人,
如有说错的地方请愿谅,甚至骂几句也无所为......

#12
zhongx2007-08-22 01:19
ayue222朋友我们再来一些复杂点的 [统计运算] 好吗?
我一直对于二个表一齐统计运算知道甚少,
在上面的例子的基础上结合下面的要求,您能做个范例吗?
=============================================================================
表名 字段0 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8
id id A B C D E F G H
-----------------------------------------------------------------------------
id2 id A2 B2 C2 D2 E2 F2 G2 H2
=============================================================================
这是数据库中二个表的结构,其实表可以没有字段5,6,7,8的,做出不过直观些,字段比原来增加了二个。
统计运算时要求表一按照上面的例子;表二除将 [计算出的和] 显示在[表字段5]外,其他按表一.
意思是将二个表合并读出显示在页面时还需要进行如下的运算:
[字段5] - [字段6] = [字段7] x [字段2] = [字段8]
----------------------------------------------------------------------------------
大概意思是:二个表的数据进行统计合并后经运算,作为数据显示在页面.
==================================================================================
<%
set rs=server.CreateObject("adodb.recordset")
sql="select * from [ID] as t where id in (select top 1 id from [ID] where A=t.A and B=t.B)"
response.write sql
rs.Open sql,conn,1,1
%>

<table>
<tr>
<td>字段0</td><td>字段1</td><td>字段2</td><td>字段3</td>
<td>字段4</td><td>字段5</td><td>字段6</td>><td>字段7</td><td>字段8</td>
</tr>
<%
if not (rs.bof and rs.eof) then
do while Not rs.eof %>
<tr>
<td><%=rs("id")%></td>
<td><%=rs("A")%></td>
<td><%=rs("B")%></td>
<td><%=rs("C")%></td>
<td><%=rs("D")%></td>
<td>表二计算出的和</td>
<td><%set rs1=conn.execute ("select sum(f) as ff from [id] where A="&rs("A")&" and B="&rs("B")):response.write rs1("ff")%>(这个结果是:表一计算出的和)</td>
<td>[字段5] - [字段6] = [字段7]</td>
<td>[字段7] x [字段2] = [字段8]</td>
</tr>
<%
rs.movenext
loop
end if
rs.close:set rs=nothing
%>
</table>
===================================================================================================


#13
ayue2222007-08-22 09:20

个人认为...这些运算完全可以在保存到数据库的之前就进行的,将统计后的结果保存到相应的字段即可 ..当然,如果是已存在的库就另当别论 ..
不知道这2个表之间有没有联系?是通过哪个字段相关联的 ?

#14
zhongx2007-08-22 15:25
在保存到数据库的之前运算完,将统计后的结果保存,然后将二个字段直接运算,
这样做速度上会快些,但查询每条数据的细节就不能了.

我意思是将2个表已有的数据经统计运算再显示,结果无需保存到数据库.
2个表之间没有联系,2个表的数据各自录入的,但字段内容基本相同.

就是想通过本次的统计运算,把2个表的数据合并结合起来及显示在页面.
#15
ayue2222007-08-22 15:35
<td>[字段5] - [字段6] = [字段7]</td>
<td>[字段7] x [字段2] = [字段8]</td>

那你的意思是这里的显示结果也是经过查询数据库再循环列出来?
如果2个表没有联系的话每一行显示的这些结果都是一样的哦 ...因为这些字段是显示在表1的循环里面的 ...
#16
zhongx2007-08-22 16:07
<td>[字段5] - [字段6] = [字段7]</td>
<td>[字段7] x [字段2] = [字段8]</td>

这二个结果是当2个表统计合并,产生了 [字段1,2,3,4]后,再通过对:
[字段5] - [字段6] 运算得到 [字段7] 的结果
[字段7] x [字段2] 运算得到 [字段8] 的结果

实际是2个表各自按 [前面已做成的范例] 得到的结果,
再统计和运算,相同的合并作一条数据显示,不相同的各自按一条数据显示.

例如:
表一的字段A是 [123] 字段B是 [8]
表二的字段A2是 [123] 字段B2是 [8]
那么这条数据就可以合并成一条数据显示了,反之则不合并而是单独作一条数据显示.




#17
ayue2222007-08-22 17:27
以下是引用zhongx在2007-8-22 16:07:06的发言:
<td>[字段5] - [字段6] = [字段7]</td>
<td>[字段7] x [字段2] = [字段8]</td>

这二个结果是当2个表统计合并,产生了 [字段1,2,3,4]后,再通过对:
[字段5] - [字段6] 运算得到 [字段7] 的结果
[字段7] x [字段2] 运算得到 [字段8] 的结果

实际是2个表各自按 [前面已做成的范例] 得到的结果,
再统计和运算,相同的合并作一条数据显示,不相同的各自按一条数据显示.

例如:
表一的字段A是 [123] 字段B是 [8]
表二的字段A2是 [123] 字段B2是 [8]
那么这条数据就可以合并成一条数据显示了,反之则不合并而是单独作一条数据显示.





...从来没有做过这么复杂的程序 ....头都被闹晕哒 ...

首先你要弄清楚,你说的统计运算是在进行数据库查询的时候进行还是对查询之后的数据集进行
目前来看你是对他们各自的2个数据集(结果)进行统计运算 ...
关键有下面几点 :
1、因为数据显示需要循环列出,那么就需要比较2个数据的数量,谁的数据多就以谁的数据集来循环....
2、通过条件 表一.A=表二.A2 and 表一.B=表二.B2来进行比较,相同进行合并统计,不同的...表一\表二的都显示 ..这里需要注意判断各表是否已经结束了循环,如果已经循环到最后则不输出..

乱七八糟的也不知道说了些撒 ....水平有限 ..请见谅 ........

#18
zhongx2007-08-22 17:39
可能是我表达能力的问题搞复杂了,跟你提出的第二点相同:

2、通过条件 表一.A=表二.A2 and 表一.B=表二.B2来进行比较,相同进行合并统计,不同的...表一\表二的都显示 ..这里需要注意判断各表是否已经结束了循环,如果已经循环到最后则不输出.
#19
ayue2222007-08-22 17:49
今天比较忙..不能直接给你代码了 ...大概说一下吧 ..

得到的2个表的数据集生成数组,sql=rs.getRows (),sql1=rs1.getRows ()
然后比较2个数据集的下标. ubound(sql,2),ubound(sql1,2),以大的进行循环..
for i=0 to ubound(sql,2) //假设sql数据多些..
<%=sql(0,i)%> //第一个表的第一个字段 ,这里是 ID
<%=sql(1,i)%> //第一个表的第二个字段 ,这里是 A
<%=sql1(0,i)%> //第二个表的第一个字段 ,这里是 ID2
<%=sql1(1,i)%> //第二个表的第二个字段 ,这里是 A2
.... //以此类推
next
#20
zhongx2007-08-22 18:46
没关系,如您愿意的话等到您有时间再来教我好吗?

我先按照您给出的思路去思考,先谢谢您!
......
1