SQL рд╕рд░реНрд╡рд░ PIVOT рдФрд░ UNPIVOT рдХрд╛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ
рдЙрджреНрджреЗрд╢реНрдп
рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо UNPIVOT рд▓реЗрдЦ рд╕реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ 12 рдорд╣реАрдиреЗ рдХрд╛ рдбреЗрдЯрд╛ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рд╣рдо UNPIVOT рдкрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрди рдХреЙрд▓рдореЛрдВ рдХреЛ рддрд┐рдерд┐рдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ 36 рдХреЙрд▓рдо рдЪреМрдбрд╝реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ PIVOT рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВрдиреЗ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЫреЛрдЯреЗ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдореИрдВ рдХреЛрдб рдореЗрдВ рдХреВрдж рдЬрд╛рдКрдВрдЧрд╛ред
UNPIVOT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
PIVOT . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
SQL
CREATE TYPE c1bs_UnPivot AS TABLE(UnPivID INT,UnPivMonth DATE,UnPivData INT)GOCREATE FUNCTION c1bs_DateFromParts(@Year SMALLINT,@Month SMALLINT,@Day SMALLINT) RETURNS DATE AS BEGINDECLARE @Date DATE=CONVERT(NVARCHAR(4),@Year)+'-'+CONVERT(NVARCHAR(2),@Month)+'-'+CONVERT(NVARCHAR(2),@Day)RETURN @DateENDGODECLARE @UnPiv TABLE(UnPivID INT,UnPivYear SMALLINT,M1 INT,M2 INT,M3 INT,M4 INT,M5 INT,M6 INT,M7 INT,M8 INT,M9 INT,M10 INT,M11 INT,M12 INT)INSERT INTO @UnPiv(UnPivID,UnPivYear,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12) SELECT 1,2010,1,2,3,4,5,6,7,8,9,10,11,12INSERT INTO @UnPiv(UnPivID,UnPivYear,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12) SELECT 1,2011,1,2,3,4,5,6,7,8,9,10,11,12INSERT INTO @UnPiv(UnPivID,UnPivYear,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12) SELECT 1,2012,1,2,3,4,5,6,7,8,9,10,11,12INSERT INTO @UnPiv(UnPivID,UnPivYear,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12) SELECT 2,2010,1,2,3,4,5,6,7,8,9,10,11,12
DECLARE @Piv AS c1bs_UnPivotINSERT INTO @PivSELECT UnPivID,dbo.c1bs_DateFromParts(UnPivYear,REPLACE(col,'M',''),1) col,valFROM @UnPivUNPIVOT (Val FOR col IN (M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12)) unpiv
PIVOT . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдкрд┐рдЫрд▓реЗ рдХрдерди рдореЗрдВ рд╣рдордиреЗ рдЙрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ UNPIVOT рд▓реЗрдЦ рдореЗрдВ, рдПрдХ рдбрдореА рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдШреЛрд╖рд┐рдд рдХреА, рдФрд░ рдлрд┐рд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ UNPIVOTED рдХрд┐рдпрд╛ред
SQL
--Complex Pivot - unknown column names--Get Column Names for belowDECLARE @Cols NVARCHAR(MAX),@Sel NVARCHAR(MAX) SELECT @Cols=COALESCE(@Cols+',','')+'['+CONVERT(NVARCHAR(20),UnPivMonth)+']',--Concatenate the Columns@Sel =COALESCE(@Sel +',','')+'ISNULL(['+CONVERT(NVARCHAR(20),UnPivMonth)+'], 0) AS ['+CONVERT(NVARCHAR(20),UnPivMonth)+']' --Concatenate the Columns into a select listFROM @Piv GROUP BY UnPivMonth ORDER BY UnPivMonth
--Columns list displaySELECT @Cols ColumnList,@Sel SelectList
--Complex Pivot SQLDECLARE @Params NVARCHAR(MAX)='@Piv c1bs_UnPivot READONLY'DECLARE @SQL NVARCHAR(MAX)='SELECT [UnPivID],'+@Sel+'FROM @PivPIVOT (SUM(UnPivData)FOR UnPivMonthIN ('+@Cols+')) AS MyTable'
--Execute SQLEXECUTE sp_executesql @SQL,--SQL String from above@Params,--Parameter list@Piv--Temp Table needs to be passed in, can only be read only
PIVOT . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдЗрд╕ рдХрдерди рдореЗрдВ рд╣рдордиреЗ рдЙрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЬрдЯрд┐рд▓ PIVOT рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реА рдЪреБрдирд┐рдВрджрд╛ рд╕реВрдЪреА рдФрд░ рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдШреЛрд╖рд┐рдд рдЪрд░, рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ PIVOT рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ред
рдпрд╣ 36 рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдбрд╛рд▓реА рдереА, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЗрд╡рд▓ рд╣рдо рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ 6 рдХреЙрд▓рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдИ рддрд┐рдерд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдереАрдВ, рддрд╛рд▓рд┐рдХрд╛ рдмрдврд╝реЗрдЧреАред
UnPivID | 01/01/2010 | 01/02/2010 | 01/03/2010 | 01/04/2010 | 01/05/2010 | 01/06/2010 |
1 | 1 | 2 | 3 | 4 | 5 | 6 |
2 | 1 | 2 | 3 | 4 | 5 | 6 |