数据库中的表行变列的方法
我想这个问题还是有点普遍性的,所以我把问题和答案留在这里,供有类似问题的朋友参考。如果谁有其他的以及更好的办法,欢迎贴出代码,大家共同进步。
原帖见:http://forums.microsoft.com/china/ShowPost.aspx?PostID=3059505&SiteID=15&mode=1
问题:
名称 价格 类型
A 23 AA
A 25 BB
A 26 CC
B 23 AA
B 25 BB
B 26 cc
表示成为这种形式:
名称 AA BB CC
A 23 25 26
B 23 25 26
我的解答:
其中表Tmp就代表你的那个表的名字:
DECLARE @Sql VARCHAR(8000)
DECLARE @TypeName VARCHAR(10)
SET @Sql = 'SELECT 名称'
DECLARE curType CURSOR READ_ONLY FORWARD_ONLY FOR (
SELECT Distinct 类型 FROM TMP)
OPEN curType
FETCH NEXT FROM curType INTO @TypeName
WHILE @@Fetch_Status = 0
BEGIN
SET @Sql = @Sql + Char(13) + Char(10) + ', Sum(Case When 类型=''' + @TypeName + ''' Then 价格 Else 0 End) AS ' + @TypeName
FETCH NEXT FROM curType INTO @TypeName
END
CLOSE curType
DEALLOCATE curType
SET @Sql = @Sql + Char(13) + Char(10) + 'FROM Tmp GROUP BY 名称'
PRINT @Sql
Exec(@Sql)
注意,要求你的表中名称和类型2个字段构成唯一索引,否则会把价格合计到一起,就不正确了。