方法一:
城市 |
员工人数 |
成都 | 10 |
深圳 | 8 |
北京 | 9 |
上海 | 3 |
大连 | 6
|
横向
城市 | 成都 | 深圳 | 北京 | 上海 | 大连 |
员工人数 | 10 | 8 | 9 | 3 | 6 |
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时在交叉表纵向最下边加纵向合计
as
declare @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,0
exec p_qry 'student1','name','subject','source','sum',1,1
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/7_databases/sql/sqlServer/20100721/473614.html