怎样实现数据库中的行列转换?在线等待!

roc9698 2003-10-15 04:03:55
在数据库中学生成绩放在一个数据表中,假设有10门课程则表中就有10条记录,怎样把它成另一个表中十个字段表示十门课程的形式,然后用datagrid显示全班的成绩单。能够动态实现,因为在数据表中新添加一门课程的成绩,在datagrid中能够显示出来,请各位高手指点一下,参与者都分!
...全文
148 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinson 2003-10-16
  • 打赏
  • 举报
回复
DataGrid 中的模板列套用一个 自定义控件
DataGrid 数据库是列出 StudentID.
自定义控件 中 加上属性再列 Select StudentID From Table1 WHERE StudentID = 'XXXXXXXXX' , 自定义控件属性的值是 XXXXXXXXX
zsww 2003-10-16
  • 打赏
  • 举报
回复
收藏!!!

-----------努力学习 不断实践 虚心讨教---------
guoyan19811021 2003-10-16
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2142/2142621.xml?temp=.6237757
yourbj 2003-10-16
  • 打赏
  • 举报
回复
Select S.StudentID, IsNull(C1.通信原理,0) AS '通信原理', IsNull(C2.编译原理,0) AS '编译原理', IsNull(C3.人工智能,0) AS '人工智能', IsNull(C4.软件工程,0) AS '软件工程'
FROM (
Select DISTINCT StudentID from YourTable) S
LEFT JOIN (
Select StudentID,Score AS '通信原理' from YourTable Where CourseName = '通信原理') C1
ON S.StudentID = C1.StudentID
LEFT JOIN (
Select StudentID,Score AS '编译原理' from YourTable Where CourseName = '编译原理') C2
ON S.StudentID = C2.StudentID
LEFT JOIN (
Select StudentID,Score AS '人工智能' from YourTable Where CourseName = '人工智能') C3
ON S.StudentID = C3.StudentID
LEFT JOIN (
Select StudentID,Score AS '软件工程' from YourTable Where CourseName = '软件工程') C4
ON S.StudentID = C4.StudentID
roc9698 2003-10-16
  • 打赏
  • 举报
回复
表结构和数据如下:
StudentID CourseName Score
00070401 通信原理 88
00070401 编译原理 85
00070401 人工智能 91
00070401 软件工程 90
00070402 软件工程 94
00070402 人工智能 95
00070403 通信原理 97
00070403 编译原理 83
00070403 软件工程 77
我想得到如下结果:
StudentID 通信原理 编译原理 人工智能 软件工程
00070401 88 85 91 90
00070402 0 0 95 94
00070403 97 83 0 77
这个Select 语句或者存储过程该如何实现?
acewang 2003-10-16
  • 打赏
  • 举报
回复
sample:
在DataTable中修改,重新建一个DataTable:
DataTable dn= new DataTable();
dn.Columns.Add("ColumnName", typeof(string));
for (int i=0; i < dt.Rows.Count; i++)
dn.Columns.Add("Column" + (i+1).ToString(), typeof(string));
foreach(DataColumn dc in dt.Columns)
{
DataRow dnr = dn.NewRow();
dnr["ColumnName"] = dc.ColumnName;
for (int i=0; i < dt.Rows.Count; i++)
{
dnr[i+1] = dt.Rows[i][dc].ToString();
}
dn.Rows.Add(dnr);
}
roc9698 2003-10-16
  • 打赏
  • 举报
回复
我还是不太明白,请给一个例子看看
cuike519 2003-10-15
  • 打赏
  • 举报
回复
老问题!存储过程或者DataTable内部转化都可以!

存储过程的我就不说,DataTable的我简单的说一说,我以前已经实现了!
首先你需要一个和原始DataTable不同的新的DataTable来存放你的转置数据.这种转置还要顾忌数据类型,新的DataTable的列是原来的表中的第一列现在的行是原来的列,也就是说将一个m*n的编程n*m的!因为列是一些有这相同属性的直转换之后这是很难保证的,所以如果非要转化最好是转化string的!如果加上类型判断是很麻烦的!我的实现中也就是判断了几种常用的数据类型!

祝你好运!
flyinglz 2003-10-15
  • 打赏
  • 举报
回复
首先获取课程表数据到DTkc,假设包括一列;
DataTable dt = new DataTable();

int iRCount = DTkc.Rows.count ;
for(int i = 0 ;i< iRcount; i++)
{
dt.Columns.Add(DTkc.rows[i][0].toString(),Typeof(System.Double));
}

这样就在内存中创建了一个表,然后可以将成绩数据加入:
DataRow dr=null;
dr = dt.NewRow();
dr[0]=90;
dr[1]=98;
...

dr[iRCount]=67;
dt.add(dr);

将所有数据加完使用
dt..AcceptChanges();

然后就可以把这个表直接绑定到datagrid中
cpp2017 2003-10-15
  • 打赏
  • 举报
回复
CREATE PROCEDURE getCrossTableOfA AS
Begin
declare @sql varchar(8000);
set @sql =' select region,';
select @sql = @sql + ' sum(case when [course_name]=''' + [course_name] +''' then num else 0 end ) as ''' +[name] +''', '
from (select distinct [course] from a ) as AA
set @sql = left(@sql,len(@sql)-1) +' from a group by region';
exec(@sql)


End
GO
qiuji 2003-10-15
  • 打赏
  • 举报
回复
你的数据库中的表结构是什么样的?

62,025

社区成员

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

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

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

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