我想让SQLSERVER2000自己做行列转置的问题,应该如何操作 。。。在线等待(135分)

  • 主题发起人 主题发起人 mrzhou
  • 开始时间 开始时间
M

mrzhou

Unregistered / Unconfirmed
GUEST, unregistred user!
举个例子,比如成绩单
对于每个学生来讲可能所学的科目不一样于是定义了一张表存放该学生所学的科目及成绩但最后我要的表格是横向的,即:
学生编号 科目 成绩
1 语文 100
1 数学 99
2 外语 98
2 数学 97

姓名 语文 数学 外语 ...
1 100 99
2 97 98
....
请问该如何写触发器和存储过程?
 
关系型模型是不支持这么转换的。如果你确实要这么做,你最好在程序中实现,而
不要交给SQL来做。
 
因为我做的系统比这个复杂得多,并且数据记录相当大,
如果在客户端处理的话实在太慢简直不能忍受.
 
恐怕只能中客户端处理了.
//关注此题.
 
我的想法是如果在明细表里每增加一条记录用触发器将该记录的值直接就填在转换个的表的
确定位置这样处理起来对客户端的影响就很小查询速也就会很快。
因为实际上我的数据库比这还更复杂,所以需要一个启发。
还是用服务器来做好些。
 
用存储过程做,
用SQL语句创建一个表,然后读取全部的科目,动态创建表字段
然后用SQL语句从原来的表中读出成绩和姓名,对应科目插入到新表中去
统计完以后删除这个表
 
我要的正是如此。
关键是这个存储过程如何写。
 
关注!大家可以试着做一下!
 
交叉数据报表
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable?、创建交叉数据报表或旋转数据。

假定有一个表 Pivot,其中每季度占一行。对 Pivot 的 SELECT 操作在垂直方向上列出这些季度:

Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4

生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:

Year Q1 Q2 Q3 Q4
1990 1.1 1.2 1.3 1.4
1991 2.1 2.2 2.3 2.4



下面的语句用于创建 Pivot 表并在其中填入第一个表中的数据:

USE Northwind
GO

CREATE TABLE Pivot
( Year SMALLINT,
Quarter TINYINT,
Amount DECIMAL(2,1) )
GO
INSERT INTO Pivot VALUES (1990, 1, 1.1)
INSERT INTO Pivot VALUES (1990, 2, 1.2)
INSERT INTO Pivot VALUES (1990, 3, 1.3)
INSERT INTO Pivot VALUES (1990, 4, 1.4)
INSERT INTO Pivot VALUES (1991, 1, 2.1)
INSERT INTO Pivot VALUES (1991, 2, 2.2)
INSERT INTO Pivot VALUES (1991, 3, 2.3)
INSERT INTO Pivot VALUES (1991, 4, 2.4)
GO

下面是用于创建旋转结果的 SELECT 语句:

SELECT Year,
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year
GO

该 SELECT 语句还处理其中每个季度占多行的表。GROUP BY 语句将 Pivot 中一年的所有行合并成一行输出。当执行分组操作时,SUM 聚合中的 CASE 函数的应用方式是这样的:将每季度的 Amount 值添加到结果集的适当列中,在其它季度的结果集列中添加 0。

如果该 SELECT 语句的结果用作电子表格的输入,那么电子表格将很容易计算每年的合计。当从应用程序使用 SELECT 时,可能更易于增强 SELECT 语句来计算每年的合计。例如:

SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
FROM (SELECT Year,
SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
FROM Pivot AS P
GROUP BY P.Year) AS P1
GO

带有 CUBE 的 GROUP BY 和带有 ROLLUP 的 GROUP BY 都计算与本例显示相同的信息种类,但格式稍有不同。

 
多人接受答案了。
 
后退
顶部