行转化为列的问题

happyxiaowuge 2010-03-26 02:35:38
在数据库中可以得到这样的表
生产 管理 1780
生产 计算机 690
生产 数控 440
销售 管理 300
销售 计算机 100
销售 数控 400
运输部 管理 200
运输部 计算机 500
运输部 数控 200

要把他在页面的GridView中实现如下数据
管理 计算机 数控
生产 1780 690 440

销售 300 100 400

运输部 200 500 200


该怎么做?
给代码可能会很多,给思路就行
...全文
220 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
happyxiaowuge 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chen_ya_ping 的回复:]
要是把数据库中的数据读到内存中,然后再组成自己要的格式。
[/Quote]

我是这么解决的 结果发现用了三个dataTable,是不是不该!
jack15850798154 2010-03-26
  • 打赏
  • 举报
回复
本人总结的你看看对你有帮助吗?
行专列和列转行问题。

有下面数据结构

名称 人数
---------------
张一 2
张二 5
张三 8
张四 11

想查询出来的显示样式如下

名称 张一 张二 张三 张四

人数 2 5 8 11

这样的语句怎么写? 那要是反过来怎么写?


(1)列转行问题:


结果
/*
名称 张一 张二 张三 张四
----- ----------- ----------- ----------- -----------
人数 2 5 8 11

*/


--列转行

declare @sql varchar(2000)
select @sql=isnull(@sql+',','')+''+Aname+'=max(case when Aname='''+Aname+'''
then
aid
else
0
end)
' from a
exec('select '+@sql+' from a')

---------------------------------------------------------------------------------------
行转列 :
if object_id('b') is not null
drop table b
create table b
(
bname varchar(20),
bname1 varchar(20),
bname2 varchar(20),
bname3 varchar(20)
)


insert into b
select '2','5','8','11'

问题分析:
静态的执行因该是:
select 'bname' as 'bname',bname as aid from b
union all
select 'bname1' as 'bname',bname1 as aid from b
union all
select 'bname2' as 'bname',bname2 as aid from b
union all
select 'bname3' as 'bname',bname3 as aid from b
规律:
关键函数 为 unpivot;


select * from (select bname,bname1,bname2,bname3 from b) p
unpivot
(orders for b in(bname,bname1,bname2,bname3)) as unpvt


结果为:
orders b
2 bname
5 bname1
8 bname2
11 bname3
阿非 2010-03-26
  • 打赏
  • 举报
回复
再来个C#实现的

C# 实现DataTable的行转列

http://blog.csdn.net/Sandy945/archive/2010/03/01/5336560.aspx
chen_ya_ping 2010-03-26
  • 打赏
  • 举报
回复
要是把数据库中的数据读到内存中,然后再组成自己要的格式。
阿非 2010-03-26
  • 打赏
  • 举报
回复

标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/
--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')

---------------------------------
阿非 2010-03-26
  • 打赏
  • 举报
回复

题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名

--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)

丰云 2010-03-26
  • 打赏
  • 举报
回复
给思路的话,用一个二维数组重新整理下就ok了。。。
guoheng90 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 foren_whb 的回复:]

这种问题,去sql版吧
[/Quote]
up
丰云 2010-03-26
  • 打赏
  • 举报
回复
这种问题,去sql版吧

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧