在对数据进行统计分析时,如果既需要保存查询结果,又能在查询结果下面将统计结果显示出来,就非常直观了。
Compute子句用于生成合计,并将其作为附加的汇总列出现在结果集的最后,当与by一起使用时,Compute子句在结果集内生成控件中断和分类汇总。可在同一查询内指定Compute by和Compute。
其语法格式如下:
[Compute
{
{Avg | count | max | min | stdev | stdevp| var | varp | sum (expression)}[,…n]
[by expressin [,….]]
}]
Compute子句中使用的聚合函数
行聚合函数 |
结果 |
Avg |
数字表达式中所有值的平均值 |
Count |
选定的行数 |
Max |
最大值 |
Min |
最小值 |
Stdev |
统计值的标准偏差 |
Stdevp |
填充统计的标准偏差 |
Sum |
求和 |
Var |
统计方差 |
Varp |
填充统计方差 |
注意:聚合函数不能使用字段别名。
Group by和Compute都可以汇总数据,但在结果集上还是存在区别的。
测试数据
1 黄*通 男 1500.0 文档部
2 汤*美 女 1200.0 设计部
3 宋*坤 男 1000.0 设计部
5 吕*洋 女 800.0 文档部
8 赵*红 女 1200.0 文档部
10 李*林 男 2000.0 设计部
11 严*丹 男 1600.0 ASP部
12 孙*昭 男 1500.0 ASP部
13 沈*鹏 女 1400.0 ASP部
16 杨*月 女 1000.0 文档部
(1) select 所属部门,部门工资合计=sum(工资) from 工资表 group by 所属部门
Group by生成单个结果集,每个组都有一个只包含分组依据和显示该组子聚合的聚合函数的行。
(2) select * from 工资表 order by 所属部门 compute sum(工资)
Compute生成多个结果集。一类结果集包含每个组的明细行,其中包含选择列表中的表达达式。另一类结果集包含组的子聚合合,或Select语句的总聚合。
在asp.net 中的应用:
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("server=(local);user id=sa;pwd=sa;Database=db_09");
con.Open();
string SqlStr = "select * from 工资表";
SqlDataAdapter ada = new SqlDataAdapter(SqlStr, con);
DataSet ds = new DataSet();
ada.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("server=(local);user id=sa;pwd=sa;Database=db_09");
con.Open();
string SqlStr = "select * from 工资表 order by 所属部门 compute sum(工资) ";
SqlDataAdapter ada = new SqlDataAdapter(SqlStr, con);
DataSet ds = new DataSet();
ada.Fill(ds);
GridView2.DataSource = ds.Tables[1].DefaultView;
GridView2.DataBind();
}
运行界面如下:
(3) 使用Compute…by….子句
在对数据进行查询时,有时需要既能显示分组情况,又能将各组数据统计结果显示出来,利用Compute by语句可以轻松实现按组显示和统计数据.
select * from 工资表 order by 所属部门 compute sum(工资) by 所属部门
注意:by关键字后的条件必须相同。上面都为所属部门
每个组的第一个结果集是明细记录,每个组的第二个结果集只包含一条记录。
在ASP.NET中的应用:
SqlConnection con = new SqlConnection("server=(local);user id=sa;pwd=sa;Database=db_09");
con.Open();
string SqlStr = "select * from 工资表 order by 所属部门 compute sum(工资) by 所属部门";
SqlDataAdapter ada = new SqlDataAdapter(SqlStr, con);
DataSet ds = new DataSet();
ada.Fill(ds);
GridView1.DataSource = ds.Tables[0].DefaultView;
GridView2.DataSource = ds.Tables[1].DefaultView;
GridView3.DataSource = ds.Tables[2].DefaultView;
GridView4.DataSource = ds.Tables[3].DefaultView;
GridView5.DataSource = ds.Tables[4].DefaultView;
GridView6.DataSource = ds.Tables[5].DefaultView;
GridView1.DataBind();
GridView2.DataBind();
GridView3.DataBind();
GridView4.DataBind();
GridView5.DataBind();
GridView6.DataBind();
界面如下: