记录集横向显示输出即交叉表的两种方法

    技术2024-10-18  4

    方法一:

     

    城市

     

     

     

     

    员工人数

    成都10深圳8北京9上海3大连

    6

     

    横向

    城市成都深圳北京上海大连员工人数108936

          DataTable dtNew = new DataTable();        dtNew.Columns.Add("ColumnName", typeof(string));        for (int i = 0; i < dt.Rows.Count; i++)       {            dtNew.Columns.Add("Column" + (i + 1).ToString(), typeof(string));       }        foreach (DataColumn dc in dt.Columns)        {            DataRow drNew = dtNew.NewRow();            drNew["ColumnName"] = dc.ColumnName;            for (int i = 0; i < dt.Rows.Count; i++)            {                drNew[i + 1] = dt.Rows[i][dc].ToString();            }            dtNew.Rows.Add(drNew);        }经过上面的语句,您的dt就已经成功转置了,你可以直接用它作为datagrid 或者gridview的数据源。

     

     

    方法二,直接在存储过程中转换

     

     

     

    存储过程中如何将sql查询结果集横向显示出,谢谢,即 字段1   字段2           显示成:       1       2       3         4         5 1               1                                     1       2       3         4         5   2               2 3               3 4               4 5               5

    下面是偶的一个输出交叉表的存储过程,比较通用 //****************************************************************** CREATE   procedure   CorssTab   @strTabName   as   varchar(50)   =   'Employees ',   --此处放表名 @strCol   as   varchar(50)   =   'City ',   --表头分组依据字段 @strGroup   as   varchar(50)   =   'TitleOfCourtesy ',--分组字段 @strNumber   as   varchar(50)   =   'ReportsTo ',   --被统计的字段 @strSum   as   varchar(10)   =   'Sum '   --运算方式 AS DECLARE   @strSql   as   varchar(1000),   @strTmpCol   as   varchar(100) EXECUTE   ( 'DECLARE   corss_cursor   CURSOR   FOR   SELECT   DISTINCT   '   +   @strCol   +   '   from   '   +   @strTabName   +   '   for   read   only   ')   --生成游标 begin SET   nocount   ON   SET   @strsql   = 'select   '   +   @strGroup   +   ',   '   +   @strSum   +   '( '   +   @strNumber   +   ')   AS   [ '   +   @strSum   +   '   of   '   +   @strNumber   +   '] '   --查询的前半段 OPEN   corss_cursor while   (0=0) BEGIN FETCH   NEXT   FROM   corss_cursor   --遍历游标,将列头信息放入变量@strTmpCol INTO   @strTmpCol if   (@@fetch_status <> 0)   break SET   @strsql   =   @strsql   +   ',   '   +   @strSum   +   '(CASE   '   +   @strCol   +   '   WHEN   ' ' '   +   @strTmpCol   +   ' ' '   THEN   '   +   @strNumber   +   '   ELSE   Null   END)   AS   [ '   +   @strTmpCol   +   '   '   +   @strCol   +   '] '   --构造查询 END SET   @strsql   =   @strsql   +   '   from   '   +   @strTabname   +   '   group   by   '   +   @strGroup   --查询结尾 EXECUTE(@strsql)   --执行 IF   @@error   <> 0   RETURN   @@error   --如果出错,返回错误代码 CLOSE   corss_cursor   DEALLOCATE   corss_cursor   RETURN   0   --释放游标,返回0表示成功 end GO

     

     

     

    同样是存储过程的方法三:

     

    生成交叉表的简单通用存储过程--create proc p_qry@TableName sysname, --表名@纵轴 sysname, --交叉表最左面的列@横轴 sysname, --交叉表最上面的列@表体内容 sysname, --交叉表的数数据字段@条件 varchar(1000),--查询的处理条件@是否加横向合计 bit, --为1时在交叉表横向最右边加横向合计@是否加纵向合计 bit --为1时在交叉表纵向最下边加纵向合计asdeclare @s nvarchar(4000),@sql varchar(8000)

    --规范条件

    --判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段

    --生成交叉表处理语句set @s='set @s=''''select @s=@s+'',[''+cast(['+@横轴+'] as varchar)+'']=sum(case ['+@横轴+'] when ''''''+cast(['+@横轴+'] as varchar)+'''''' then ['+@表体内容+'] else 0 end)''from ['+@TableName+']'+@条件+'group by ['+@横轴+']'exec sp_executesql @s,N'@s varchar(8000) out',@sql out

    --是否生成合计字段的处理declare @sum1 varchar(200),@sum2 varchar(200),@sum3 varchar(200)select @sum1=case @是否加横向合计when 1 then ',[合计]=sum(['+@表体内容+'])'else '' end,@sum2=case @是否加纵向合计when 1 then '['+@纵轴+']=case grouping(['+@纵轴+']) when 1 then ''合计'' else cast(['+@纵轴+'] as varchar) end'else '['+@纵轴+']' end,@sum3=case @是否加纵向合计when 1 then ' with rollup'else '' end

    --生成交叉表exec('select '+@sum2+@sql +@sum1+'from ['+@TableName+']'+@条件+'group by ['+@纵轴+']'+@sum3)

    调用语句

    exec   p_qry   'student1','name','subject','source','sum',0,0exec   p_qry   'student1','name','subject','source','sum',1,1

     

     

     

     

     

    文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/7_databases/sql/sqlServer/20100721/473614.html

     

    最新回复(0)