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

方法一:

 

城市

 

 

 

 

员工人数

成都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时在交叉表纵向最下边加纵向合计
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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值