高分求一個將一表的行列轉換的一個存儲過程!

liulangnanhai 2003-03-27 10:46:09
請高手給個示例,或給一個建議
...全文
5 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Robin_Fang 2003-04-01
Sorry!
前两天不在,今天新浪邮箱又不正常。
如果已解决则算了,尚还需要的话稍后给你。
To:大力
说实话我看清了你的所谓动态的过程,当我给你不同源数据时,你能在交叉过程中一个字符不改动吗?或许我没有表达清楚我所说的意思----即任何需要做交叉的数据均可直接调用交叉过程,而不用用任何改动。
回复
liulangnanhai 2003-03-28
不需要了,謝謝你了,大力,
看來大恩不言謝了,只有給分了
回复
pengdali 2003-03-28
to Robin_Fang(Robin)
你看完帖子吧!我的第二个方法需要吗????哈哈。。。。。
回复
nice90 2003-03-28
经过我的测试,我发觉“大力”的程序还是很不错的。特别是在某些时候用到统计的时候。
回复
nice90 2003-03-28
看来我只有学习了。
回复
Robin_Fang 2003-03-28
大力的方法仅能处理源数据结构明确的情况,而不能做成一个公用的过程。
我做了个通用的交叉过程,可以按如下方式提供参数:
@vSourceTAB As Varchar(2000), --数据来源表,可以为表,视图,或者SQL语句(要用括号以及别名:如上注释段)
@vGroupbyField As Varchar(200), --被Selct Group By 要显示出来的,可以多个字段(记录可以有空值)
@vTransFormCol As Varchar(100), --交叉表中的合计等函数计算值的字段
@vFunction As Varchar(50), --默认值,交叉表中的函数,也可以是' 2*Sum'的计算公式
@vPivotCol As Varchar(50), --要转换成列的字段,唯一列,可以是表达式'Field1+Field2'(记录可以有空值)
@vStrWhere As Varchar(500) =Null, --Where 约束条件,可以为空
@vGroupFldType As Varchar(5)=Null --要转换成列的字段类型,如果是非数字型则不进行求和等运算
如果需要请Email: robin_f@sina.com
回复
pengdali 2003-03-27
可以动态:

declare @sql varchar(8000)
set @sql = 'select 年份'
select @sql = @sql + ',sum(case 季度 when '''+cast(季度 as varchar)+''' then 数据 else 0 end) as '''+cast(季度 as varchar)+'季度数据'''
from (select distinct 季度 from 有一表) as a
select @sql = @sql+' from 有一表 group by 年份'

exec(@sql)
go
回复
pengdali 2003-03-27
交叉数据报表
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 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 都计算与本例显示相同的信息种类,但格式稍有不同
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2003-03-27 10:46
社区公告
暂无公告