分组查询
在动态网页开发过程中,根据用户需求,经常需要把数据表中的某一字段内容按照一定的规定进行分组,然后再把同一组数据的某个字段信息进行统计,得到查询结果。
1.使用GROUP BY子句查询
在SQL语句中,可以使用GROUP BY子句按某一列数据的值进行分组,在分组的基础上再进行查询。使用GROUP BY子句时,如果SELECT子句中包含聚集函数,则是计算每组的统计值,在SELECT子句中的查询数据列除了出现在聚集函数中的列以外,都必须在GROUP BY子句中应用。在GROUP BY子句中,不支持字段列的别名,也不支持任何使用了统计函数的集合列。
下面通过选择分组字段名称进行分组查询,并统计每组的积分和。程序代码如下:
<%
If Request("cb_group")<>"" Then cb_group=Request("cb_group")
Set rs=Server.CreateObject("ADODB.Recordset")
sqlstr="select "&cb_group&",sum(Score) as Score from UserInfo group by "&cb_group&""
rs.open sqlstr,Conn,1,1
%>
2.使用HAVING子句查询
使用GROUP BY子句对数据进行分组后,可以在HAVING 子句中指定条件,限制在查询中出现的组,即对GROUP BY子句查询结果进行再次筛选,满足HAVING子句中条件的数据才会出现在结果集中。HAVING 子句可以引用选择列表中出现的任意项。
例如,使用GROUP BY子句按会员等级进行分组,查询每组积分数之和大于输入数值的分组信息,代码如下:
<%
Set rs=Server.CreateObject("ADODB.Recordset")
sqlstr="select UserLevel,sum(Score) as Score from UserInfo group by UserLevel having sum(Score) > "&txt_num&""
rs.open sqlstr,Conn,1,1
%>
使用GROUP BY子句按会员等级进行分组,查询每组包含的数据行数大于输入数值的分组信息,代码如下:
<%
Set rs=Server.CreateObject("ADODB.Recordset")
sqlstr="select UserLevel,sum(Score) as Score from UserInfo group by UserLevel having count(*) > "&txt_num&""
rs.open sqlstr,Conn,1,1
%>
3.使用ALL关键字查询
在GROUP BY子句中可以使用ALL关键字。只有在SELECT语句中包含WHERE子句时,ALL关键字才有意义。
如果未使用ALL关键字,包含GROUP BY子句的SELECT语句将不显示没有符合WHERE子句中条件的行的分组。如果使用ALL关键字,查询结果集将包含由GROUP BY子句产生的所有分组,即使某些组中没有符合搜索条件的行。
例如,按用户名称进行分组,如果没有使用ALL关键字,查询结果只显示用户积分大于输入数值的分组信息,使用ALL关键字后,查询结果将显示所有分组信息,代码如下:
<%
Set rs=Server.CreateObject("ADODB.Recordset")
sqlstr="select UserName,sum(Score) as Score from UserInfo where Score > "&txt_num&" group by all UserName"
rs.open sqlstr,Conn,1,1
%>
4.使用CUBE关键字查询
使用CUBE关键字可以对查询结果进行统计。CUBE关键字定义在使用了GROUP BY子句的SELECT语句中,该语句的选择列表应包含列和聚合函数表达式,选择列表中的列称为“维”。它生成的结果集是多维数据集,多维数据集是一个结果集,其中包含了各维数据以及各维的所有可能组合的统计数据。
在下面的代码中,使用CUBE关键字进行分组查询,变量“group_name”表示进行分组的列名称字符串。如果变量“group_name”取值为“UserLevel,Address”,结果集中包含“UserLevel”和“Address”的所有可能组合的积分数之和。
<%
Set rs=Server.CreateObject("ADODB.Recordset")
sqlstr="select "&group_name&",sum(Score) as Score from UserInfo group by "&group_name&" with cube"
rs.open sqlstr,Conn,1,1
%>

RSS订阅






