您的位置:首页 > 数据库

SQL pivot 行转列

2016-04-01 17:22 190 查看
--CREATE TABLE [dbo].[Pivot_Test](
--	[UserName] [nvarchar](50) NOT NULL,
--	[Gains] [decimal](18, 2) NOT NULL,
--	[GainsType] [nvarchar](50) NOT NULL
--) ON [PRIMARY]

GO

--INSERT INTO Pivot_Test(UserName,Gains,GainsType) values('a','1','i1')

--INSERT INTO Pivot_Test(UserName,Gains,GainsType) values('a','1','i2')

--INSERT INTO Pivot_Test(UserName,Gains,GainsType) values('a','1','i3')

--INSERT INTO Pivot_Test(UserName,Gains,GainsType) values('b','1','i1')

--INSERT INTO Pivot_Test(UserName,Gains,GainsType) values('b','1','i2')

--INSERT INTO Pivot_Test(UserName,Gains,GainsType) values('c','1','i1')

--INSERT INTO Pivot_Test(UserName,Gains,GainsType) values('c','1','i2')

--INSERT INTO Pivot_Test(UserName,Gains,GainsType) values('d','1','i1')

--INSERT INTO Pivot_Test(UserName,Gains,GainsType) values('d','1','i2')

select * from Pivot_Test

DECLARE @sql NVARCHAR(4000)
SELECT  @sql = ISNULL(@sql + ',', '') + GainsType
FROM Pivot_Test
GROUP BY GainsType
PRINT @sql
IF ( CHARINDEX(@sql, ',') = 0 )
BEGIN
EXEC ('select * from Pivot_Test a pivot (sum(Gains) for GainsType in (' + @sql + ')) b')--可以使用
END

--------------------------------------------------------------------------------------------------------------
--CREATE TABLE [dbo].[Pivot_TestNew](
--	[UserName] [nvarchar](50) NOT NULL,
--	[Gains] [decimal](18, 2) NOT NULL,
--	[GainsType] [nvarchar](50) NOT NULL
--) ON [PRIMARY]

--INSERT INTO Pivot_TestNew(UserName,Gains,GainsType) values('a','1','i1 1')

--INSERT INTO Pivot_TestNew(UserName,Gains,GainsType) values('a','1','i2 1')

--INSERT INTO Pivot_TestNew(UserName,Gains,GainsType) values('a','1','i3 1')

--INSERT INTO Pivot_TestNew(UserName,Gains,GainsType) values('b','1','i1 1')

--INSERT INTO Pivot_TestNew(UserName,Gains,GainsType) values('b','1','i2 1')

--INSERT INTO Pivot_TestNew(UserName,Gains,GainsType) values('c','1','i1 1')

--INSERT INTO Pivot_TestNew(UserName,Gains,GainsType) values('c','1','i2 1')

--INSERT INTO Pivot_TestNew(UserName,Gains,GainsType) values('d','1','i1 1')

--INSERT INTO Pivot_TestNew(UserName,Gains,GainsType) values('d','1','i2 1')

select * from Pivot_TestNew

DECLARE @sql2 NVARCHAR(4000)
SELECT  @sql2 = ISNULL(@sql2 + ',', '') + REPLACE(GainsType,' ','_') FROM (select * FROM Pivot_TestNew
group by GainsType,Gains,UserName
) tt
GROUP BY GainsType
PRINT @sql2
IF ( CHARINDEX(@sql2, ',') = 0 )
BEGIN
EXEC ('select * from(
select UserName,ISNULL(Gains, ''0'') AS Gains,REPLACE(GainsType,'' '',''_'') AS GainsType
FROM Pivot_TestNew
group by GainsType,Gains,UserName
) tt pivot (sum(Gains) for GainsType in (' + @sql2 + ')) b')--可以使用
END

--REPLACE(GainsType,'' '',''_'')
--ISNULL(REPLACE(GainsType,'' '',''_''),0)
--REPLACE(ISNULL(GainsType,0),'' '',''_'')
----------------------------如果有空格替换(REPLACE)空格,有NULL值(ISNULL)替换NULL值----------------------------
EXEC('SELECT REPLACE(UserName,'' '',''_'') AS UserName,ISNULL(Gains, ''0'') AS Gains,GainsType FROM Pivot_Test')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: