经典行转列例子
/*******************************************************************************
*課程表:Course
********************************************************************************/
CREATE TABLE #Course ( CourseName VARCHAR(10) );
INSERT? INTO #Course
??????? ( CourseName )
VALUES? ( '語文' ),
??????? ( '數學' ),
??????? ( '英語' )
SELECT? *
FROM??? #Course
/*******************************************************************************
*學生成績表:Score
********************************************************************************/
CREATE TABLE #Score
??? (
????? StudentName VARCHAR(10) ,
????? CourseName VARCHAR(10) ,
????? Score INT
??? );
INSERT? INTO #Score
??????? ( StudentName, CourseName, Score )
VALUES? ( '小紅', '語文', 76 ),
??????? ( '小紅', '數學', 85 ),
??????? ( '小紅', '英語', 55 ),
??????? ( '小李', '語文', 90 ),
??????? ( '小李', '英語', 74 ),
??????? ( '小林', '語文', 87 ),
??????? ( '小林', '數學', 90 )
SELECT? *
FROM??? #Score
/*******************************************************************************
*組織所有的課程
********************************************************************************/
DECLARE @CourseName VARCHAR(200) = ''
DECLARE @SelectSQL NVARCHAR(2000)
DECLARE @sql NVARCHAR(2000)
SELECT? @CourseName = @CourseName + '[' + CourseName + '],'
FROM??? #Course
SET @CourseName = LEFT(@CourseName, LEN(@CourseName) - 1)
/*******************************************************************************
*行轉列操作
********************************************************************************/
SET @SelectSQL = 'SELECT pvt.*
?FROM
?(
?? SELECT StudentName, CourseName, Score FROM #Score
?) p
?PIVOT( SUM(Score) For CourseName in ({0})) AS pvt'
SET @SelectSQL = REPLACE(@SelectSQL, '{0}', @CourseName)?????????????? ?
EXEC sp_executesql @SelectSQL
/*總分*/
SET @sql = ' SELECT m.* , n.total
FROM
(
?? ?SELECT * FROM
?? ??? ?(
?? ??? ??? ?SELECT * FROM #Score
?? ??? ?) p
?? ??? ?PIVOT (SUM(Score) FOR CourseName in ('+ @CourseName + ')) b
) m ,
(
SELECT StudentName,sum(Score) AS total from #Score
GROUP BY StudentName
)n
WHERE m.StudentName= n.StudentName'
EXEC sp_executesql @sql
/*******************************************************************************
*刪除臨時表
********************************************************************************/
DROP TABLE #Course
DROP TABLE #Score
如圖
總結
- 上一篇: C#系列之{流和序列化}
- 下一篇: virtualbox启用远程桌面