用ROLLUP进行分类数据统计(二)

作者在 2006-10-11 00:49:00 发布以下内容
作者佚名 来源InterNet 加入时间:2005-1-31
下面开始介绍如何用datagrid结合rollup语句来进行分类统计。

我们要达到的效果是这样的:

















首先,应先将数据库中的产品数据按照所属的不同的目录列举出来,这其中要用到一些技巧,详细的可以参考《在DATAGRID中使用分类标题》一文(http:// http://tech.ccidnet.com/pub/article/c1110_a70590_p1.html)。这里先用SQL语句,从数据库读取product表的数据,之后放到dataset的默认datatable中去,然后检查每一个产品所属的类别,如果发现某一个产品的类别和前一条记录中产品所属的类别不一样的话,那么就可以肯定当前产品是属于一个新的分类了,就可以插入新的行,并且加以修饰,成为分类标题,同时将roll up的统计结果显示在相应的位置就可以了。我们先来看page_load部分的代码

Sub Page_Load(Sender As Object, E As EventArgs) Handles MyBase.Load
    ' TODO: Update the ConnectionString and CommandText values for your application
dim  ConnectionString as string = "server=localhost;database=northwind;UID=sa"

    Dim CommandText As String = "Select CASE WHEN (Grouping(CategoryName)=1) THEN " & _
              "'MainTotal' ELSE categoryname END AS CategoryName, "
    CommandText &= " CASE WHEN (Grouping(ProductName)=1) THEN 'SubTotal' ELSE " & _
              "Productname END AS ProductName,"
    CommandText &= " Sum(UnitPrice) as unitprice, "
    CommandText &= " Sum(UnitsinStock) as UnitsinStock "
    CommandText &= " from Products INNER JOIN Categories On Products.categoryID = " & _
                    " Categories.CategoryID"
    CommandText &= " Group By Categoryname, ProductName WITh ROLLUP "

    Dim myConnection As New SqlConnection(ConnectionString)
    Dim myCommand As New SqlDataAdapter(CommandText, myConnection)

    Dim ds As New DataSet
    myCommand.Fill(ds)

    Dim curCat As String  ‘指示当前记录中产品所属的类别
    Dim prevCat As String  ‘指示上一条记录中产品所属的类别
    Dim i As Integer = 0   ‘要插入分类标题行的位置,用I表示
'遍历结果集,找出要插入分类标题的行
    Do While i <= ds.Tables(0).Rows.Count - 1
        curCat = ds.Tables(0).Rows(i).Item(0)
        If curCat <> prevCat Then  ‘如果发现前后两记录的所属类别不一样
            prevCat = curCat
            Dim shRow As DataRow = ds.Tables(0).NewRow

            shRow(1) = ds.Tables(0).Rows(i).Item(0)
            
            'Change ItemDataBound marker to Negative Number
            shRow(2) = -1  ‘‘设置一个临时的标记
                ds.Tables(0).Rows.InsertAt(shRow, i)
                      i += 1
        End If
             i += 1
     Loop
    ‘将最后一行的标题改为total
    ds.Tables(0).Rows(ds.Tables(0).Rows.Count - 1).Item(1) = "Total"
    DataGrid1.DataSource = ds
    DataGrid1.DataBind()
End Sub


可以看到,上面用到的技巧基本和《在DATAGRID中使用分类标题》的是差不多的,只不过为了在最后统计所有的分类结果,将最后一行的标题改为total。之后,我们
asp.net | 阅读 880 次
文章评论,共0条
游客请输入验证码