天天看點

sqlserver 行轉列

--建立測試表

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestRows2Columns]') AND type in (N'U'))

DROP TABLE [dbo].[TestRows2Columns]

GO

CREATE TABLE [dbo].[TestRows2Columns](

    [Id] [int] IDENTITY(1,1) NOT NULL,

    [UserName] [nvarchar](50) NULL,

    [Subject] [nvarchar](50) NULL,

    [Source] [numeric](18, 0) NULL

) ON [PRIMARY]

GO

--插入測試資料

INSERT INTO [TestRows2Columns] ([UserName],[Subject],[Source]) 

    SELECT N'張三',N'國文',60  UNION ALL

    SELECT N'李四',N'數學',70  UNION ALL

    SELECT N'王五',N'英語',80  UNION ALL

    SELECT N'王五',N'數學',75  UNION ALL

    SELECT N'王五',N'國文',57  UNION ALL

    SELECT N'李四',N'國文',80  UNION ALL

    SELECT N'張三',N'英語',100

GO

SELECT * FROM [TestRows2Columns]

--1:靜态拼接行轉列

SELECT [UserName],

SUM(CASE [Subject] WHEN '數學' THEN [Source] ELSE 0 END) AS '[數學]',

SUM(CASE [Subject] WHEN '英語' THEN [Source] ELSE 0 END) AS '[英語]',

SUM(CASE [Subject] WHEN '國文' THEN [Source] ELSE 0 END) AS '[國文]'     

FROM [TestRows2Columns]

GROUP BY [UserName]

GO

--2:動态拼接行轉列

DECLARE @sql VARCHAR(8000)

SET @sql = 'SELECT [UserName],'   

SELECT @sql = @sql + 'SUM(CASE [Subject] WHEN '''+[Subject]+''' THEN [Source] ELSE 0 END) AS '''+QUOTENAME([Subject])+''','   

FROM (SELECT DISTINCT [Subject] FROM [TestRows2Columns]) AS a     

SELECT @sql = LEFT(@sql,LEN(@sql)-1) + ' FROM [TestRows2Columns] GROUP BY [UserName]'   

PRINT(@sql)

EXEC(@sql)

GO

--3:靜态PIVOT行轉列

SELECT  *

FROM    ( SELECT    [UserName] ,

                    [Subject] ,

                    [Source]

          FROM      [TestRows2Columns]

        ) p PIVOT

( SUM([Source]) FOR [Subject] IN ( [數學],[英語],[國文] ) ) AS pvt

ORDER BY pvt.[UserName];

GO

--4:動态PIVOT行轉列

DECLARE @sql_str VARCHAR(8000)

DECLARE @sql_col VARCHAR(8000)

SELECT @sql_col = ISNULL(@sql_col + ',','') + QUOTENAME([Subject]) FROM [TestRows2Columns] GROUP BY [Subject]

SET @sql_str = '

SELECT * FROM (

    SELECT [UserName],[Subject],[Source] FROM [TestRows2Columns]) p PIVOT 

    (SUM([Source]) FOR [Subject] IN ( '+ @sql_col +') ) AS pvt 

ORDER BY pvt.[UserName]'

PRINT (@sql_str)

EXEC (@sql_str)

--5:參數化動态PIVOT行轉列

-- =============================================

-- Author:        <聽風吹雨>

-- Create date: <2014.05.26>

-- Description:    <參數化動态PIVOT行轉列>

-- Blog:        <http://www.cnblogs.com/gaizai/>

-- =============================================

DECLARE @sql_str NVARCHAR(MAX)

DECLARE @sql_col NVARCHAR(MAX)

DECLARE @tableName SYSNAME --行轉清單

DECLARE @groupColumn SYSNAME --分組字段

DECLARE @row2column SYSNAME --行變列的字段

DECLARE @row2columnValue SYSNAME --行變列值的字段

SET @tableName = 'TestRows2Columns'

SET @groupColumn = 'UserName'

SET @row2column = 'Subject'

SET @row2columnValue = 'Source'

--從行資料中擷取可能存在的列

SET @sql_str = N'

SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['[email protected]+']) 

    FROM ['[email protected]+'] GROUP BY ['[email protected]+']'

--PRINT @sql_str

EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@[email protected]_col OUTPUT

--PRINT @sql_col

SET @sql_str = N'

SELECT * FROM (

    SELECT ['[email protected]+'],['[email protected]+'],['[email protected]+'] FROM ['[email protected]+']) p PIVOT 

    (SUM(['[email protected]+']) FOR ['[email protected]+'] IN ( '+ @sql_col +') ) AS pvt 

ORDER BY pvt.['[email protected]+']'

--PRINT (@sql_str)

EXEC (@sql_str)

--6:帶條件查詢的參數化動态PIVOT行轉列

-- =============================================

-- Author:        <聽風吹雨>

-- Create date: <2014.05.26>

-- Description:    <參數化動态PIVOT行轉列,帶條件查詢的參數化動态PIVOT行轉列>

-- Blog:        <http://www.cnblogs.com/gaizai/>

-- =============================================

DECLARE @sql_str NVARCHAR(MAX)

DECLARE @sql_col NVARCHAR(MAX)

DECLARE @sql_where NVARCHAR(MAX)

DECLARE @tableName SYSNAME --行轉清單

DECLARE @groupColumn SYSNAME --分組字段

DECLARE @row2column SYSNAME --行變列的字段

DECLARE @row2columnValue SYSNAME --行變列值的字段

SET @tableName = 'TestRows2Columns'

SET @groupColumn = 'UserName'

SET @row2column = 'Subject'

SET @row2columnValue = 'Source'

SET @sql_where = 'WHERE UserName = ''王五'''

--從行資料中擷取可能存在的列

SET @sql_str = N'

SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['[email protected]+']) 

    FROM ['[email protected]+'] '[email protected]_where+' GROUP BY ['[email protected]+']'

--PRINT @sql_str

EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@[email protected]_col OUTPUT

--PRINT @sql_col

SET @sql_str = N'

SELECT * FROM (

    SELECT ['[email protected]+'],['[email protected]+'],['[email protected]+'] FROM ['[email protected]+']'[email protected]_where+') p PIVOT 

    (SUM(['[email protected]+']) FOR ['[email protected]+'] IN ( '+ @sql_col +') ) AS pvt 

ORDER BY pvt.['[email protected]+']'

--PRINT (@sql_str)

EXEC (@sql_str)

http://www.cnblogs.com/gaizai/p/3753296.html