рдЧрддрд┐рд╢реАрд▓ SQL рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде PIVOT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ SQL рд╕рд░реНрд╡рд░
рд▓реЗрдЦрдХ
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдорд╛рдирдХ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ PIVOT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдЬрд╣рд╛рдВ рдЖрдк рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рд╕рднреА рдХреЙрд▓рдореЛрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЙрд╕реА рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдм рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рдХреЙрд▓рдо рдирд╛рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рдЙрд╕ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣рд╛рдВ рд▓рд╛рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕рдХреНрдпреВрдПрд▓ рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред
CREATE TYPE c1bs_Piv AS TABLE(MyRow NVARCHAR(10),--Row IDMyCol NVARCHAR(10),--Value to become columnCalcCol INT--Value to be Summed)GODECLARE @Piv c1bs_PivINSERT INTO @PivSELECT '1','1',1 UNIONSELECT '1','s',1 UNIONSELECT '1','3',1 UNIONSELECT '2','2',6 UNIONSELECT '2','2',1 UNIONSELECT '2','3',1 UNIONSELECT '3','5',5 UNIONSELECT '3','2',1 UNIONSELECT '3','3',1 UNIONSELECT '3','3',3
рдХреНрдпрд╛ рдпреЗ рд╕рд╣рд╛рдпрдХ рдерд╛?
рджреВрд╕рд░реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдХреЙрд▓рдо рдирд╛рдореЛрдВ (1,2,3) рдХреЛ рд╣рд╛рд░реНрдб рдХреЛрдб рдХрд┐рдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХрднреА-рдХрднреА рд░рд┐рдХреЙрд░реНрдб рд╕реЗрдЯ рдХреЛ рдмрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЬреАрдпреВрдЖрдИ рдХреЛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рднреЗрдЬрдирд╛, рдПрдХ рд╣реИ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░, рдЪрд▓реЛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрджрдо рд╕реЗ рдХрджрдо рдорд┐рд▓рд╛рдХрд░ рдЪрд▓рддреЗ рд╣реИрдВ;
- рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдПрдВред
- рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдбрд╛рд▓реЗрдВ (@Piv)
- рджреЛ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рдПрдХ рд╕реНрддрдВрдн рдирд╛рдореЛрдВ рдХреЛ рдкрд┐рд╡рдЯ рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдПрдХ рдЪрдпрди рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, ISNULL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рд╕реНрддрдВрдн рдирд╛рдореЛрдВ рд╕реЗ рдХрд┐рд╕реА рднреА NULL рдорд╛рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рддрд╛ рд╣реИред рд╣рдордиреЗ рдирд╛рдореЛрдВ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП COALESCE рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред
- @Piv рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдЬреЛ рдмрд╛рдж рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
- рд╣рдорд╛рд░реЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдХреЙрд▓рдо рдирд╛рдореЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реВрдЪреА рдХреЛ рд╕рд╛рдзрд╛рд░рдг рдкрд┐рд╡реЛрдЯ рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЪреБрдирддреЗ рд╣реИрдВред
- рдЙрдкрд░реЛрдХреНрдд SQL рдХрдерди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ @PIV рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред
--Complex Pivot - unknown column names--Get Column Names for belowDECLARE @Cols NVARCHAR(MAX),@Sel NVARCHAR(MAX) SELECT @Cols=COALESCE(@Cols+',','')+'['+MyCol+']',--Concatenate the Columns @Sel =COALESCE(@Sel +',','')+'ISNULL(['+MyCol+'], 0) AS ['+MyCol+']' --Concatenate the Columns into a select listFROM @Piv GROUP BY MyCol
--Columns list displaySELECT @Cols ColumnList,@Sel SelectList
--Complex Pivot SQLDECLARE @Params NVARCHAR(MAX)='@Piv c1bs_Piv READONLY'DECLARE @SQL NVARCHAR(MAX)='SELECT [MyRow],'+@Sel+'FROM @PivPIVOT (SUM(CalcCol)FOR MyColIN ('+@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?
рдХреНрдпрд╛ рдпреЗ рд╕рд╣рд╛рдпрдХ рдерд╛?
рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдЕрдм рдбреЗрдЯрд╛рд╕реЗрдЯ рд╕реЗ рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓рдо рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЧрдП рд╣реИрдВ (5,s)
MyRow | 1 | 2 | 3 | 5 | s |
1 | 1 | 0 | 1 | 0 | 1 |
2 | 0 | 7 | 1 | 0 | 0 |
3 | 0 | 1 | 4 | 5 | 0 |