方法一:
城市
员工人数
成都10深圳8北京9上海3大连6
横向
城市成都深圳北京上海大连员工人数108936DataTable 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