рдЖрдзреБрдирд┐рдХ рд╕реВрдЪрдирд╛ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ, рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдХреНрд╕рд░ рд╕рдореЗрдХрд┐рдд рд╕реВрдЪрдирд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЬрдм рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓рдо рдореЗрдВ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред
T-SQL рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ
PIVOT рдирд┐рд░реНрдорд╛рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐
PIVOT рдЕрднреА рддрдХ
SQL Server 2000 рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдИ CASE WHENs рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ
PIVOT рд╣реЛрдиреЗ рдкрд░ CASE рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░,
PIVOT рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдбрд┐рдЬрд╛рдЗрди рд╣реИ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрдЗрдП рдЗрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рджреЗрдЦреЗрдВ ...
рдЖрдЗрдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдХрд╛рд░реНрдпрд╕реНрдерд▓реЛрдВ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреАред
IF OBJECT_ID('dbo.WorkOut', 'U') IS NOT NULL DROP TABLE dbo.WorkOut GO CREATE TABLE dbo.WorkOut ( DateOut DATETIME NOT NULL, EmployeeID INT NOT NULL, CONSTRAINT PK_WorkOut PRIMARY KEY CLUSTERED (DateOut, EmployeeID) ) GO
рдФрд░ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рднрд░реЗрдВ:
INSERT INTO dbo.WorkOut (EmployeeID, DateOut) SELECT TOP 1500000 ao.[object_id], ao1.modify_date FROM sys.all_objects ao CROSS JOIN sys.all_objects ao1
рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ
PIVOT рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдХрд░реНрдордЪрд╛рд░реА рдХреЗ рд▓рд┐рдП рджрд┐рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рдПрдЧрд╛:
SELECT * FROM ( SELECT EmployeeID , [WeekDay] = DATENAME(WEEKDAY, DateOut) FROM dbo.WorkOut ) t PIVOT ( COUNT([WeekDay]) FOR [WeekDay] IN ( Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday ) ) p
рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдпреЛрдЬрдирд╛ рдФрд░ рд▓реАрдб рд╕рдордп рдорд┐рд▓реЗрдЧрд╛:
SQL рд╕рд░реНрд╡рд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
рд╕реАрдкреАрдпреВ рд╕рдордп = 5662 рдПрдордПрд╕, рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 8075 рдПрдордПрд╕редрдпреЛрдЬрдирд╛ рдкрд░, рдЖрдк рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ
рд╕реЙрд░реНрдЯ рдФрд░
рд╣реИрд╢ рдореИрдЪ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рдкреНрд░рднрд╛рд╡реА рд╕рдВрдЪрд╛рд▓рди рдЗрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдХреА рдЙрдкрд▓рдмреНрдз рдорд╛рддреНрд░рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХ рдорд╛рддреНрд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
рдЯреЗрдореНрдкреЗрдбрдм рдбреЗрдЯрд╛рдмреЗрд╕ (рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди) рдореЗрдВ рд╣реЛрдЧреА - рдЗрд╕рд╕реЗ рдбрд┐рд╕реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рднрд╛рд░ рдЖ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдмрдврд╝ рд╕рдХрддрд╛ рд╣реИ:
SQL рд╕рд░реНрд╡рд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
рд╕реАрдкреАрдпреВ рд╕рдордп = 6193 рдПрдордПрд╕, рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 9571 рдПрдордПрд╕редрдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐
CASE WHEN рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕рдорд╛рди рдирд┐рд░реНрдорд╛рдг рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ:
SELECT EmployeeID , Monday = COUNT(CASE WHEN [WeekDay] = 'Monday' THEN 1 END) , Tuesday = COUNT(CASE WHEN [WeekDay] = 'Tuesday' THEN 1 END) , Wednesday = COUNT(CASE WHEN [WeekDay] = 'Wednesday' THEN 1 END) , Thursday = COUNT(CASE WHEN [WeekDay] = 'Thursday' THEN 1 END) , Friday = COUNT(CASE WHEN [WeekDay] = 'Friday' THEN 1 END) , Saturday = COUNT(CASE WHEN [WeekDay] = 'Saturday' THEN 1 END) , Sunday = COUNT(CASE WHEN [WeekDay] = 'Sunday' THEN 1 END) FROM ( SELECT EmployeeID , [WeekDay] = DATENAME(WEEKDAY, DateOut) FROM dbo.WorkOut ) t GROUP BY EmployeeID
рдЬрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдпреЛрдЬрдирд╛ рдорд┐рд▓рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп
PIVOT (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рд░реНрдЬрд┐рди рдХреЗ рднреАрддрд░) рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛:
SQL рд╕рд░реНрд╡рд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
рд╕реАрдкреАрдпреВ рд╕рдордп = 5201 рдПрдордПрд╕, рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 8400 рдПрдордПрд╕редрд╕реНрдореГрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ:
SQL рд╕рд░реНрд╡рд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
рд╕реАрдкреАрдпреВ рд╕рдордп = 6006 рдПрдордПрд╕, рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 13883 рдПрдордПрд╕редрдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд╡рд▓реЛрдХрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЬрдм рдХрд┐рд╕реА рдПрдХрд▓ рд╕реНрддрдВрдн рдкрд░ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ
PIVOT рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░ рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХреА рдХрдореА рд╣реИред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╢реБрджреНрдз рдХреЙрд▓рдо рдХреЛ рдмрдврд╝рд╛рддреЗ рд╕рдордп рдпреЗ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдПрдХрддреНрд░реАрдХрд░рдг рд╣реЛ рд░рд╣рд╛ рд╣реИред
1. рдЕрдиреБрднрд╛рдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХрд░рдг: рдХрд░реНрдордЪрд╛рд░реА + рд╡рд░реНрд╖:
SELECT EmployeeID , [Year] , Monday = COUNT(CASE WHEN [WeekDay] = 'Monday' THEN 1 END) , ... , Sunday = COUNT(CASE WHEN [WeekDay] = 'Sunday' THEN 1 END) FROM ( SELECT EmployeeID , [Year] = YEAR(DateOut) , [WeekDay] = DATENAME(WEEKDAY, DateOut) FROM dbo.WorkOut ) t GROUP BY EmployeeID, [Year]
SQL рд╕рд░реНрд╡рд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
рд╕реАрдкреАрдпреВ рд╕рдордп = 5569 рдПрдордПрд╕, рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 9200 рдПрдордПрд╕ред SELECT * FROM ( SELECT EmployeeID , [Year] = YEAR(DateOut) , [WeekDay] = DATENAME(WEEKDAY, DateOut) FROM dbo.WorkOut ) t PIVOT ( COUNT([WeekDay]) FOR [WeekDay] IN ( Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday ) ) p
SQL рд╕рд░реНрд╡рд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
CPU рд╕рдордп = 5454 ms, рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 8878 msредрдпрджрд┐ рдЖрдк рдпреЛрдЬрдирд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
PIVOT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп
рд╣реИрд╢ рдореИрдЪ рдСрдкрд░реЗрд╢рди рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдЕрдиреНрдпрдерд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
2. рдЕрдиреБрднрд╛рдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХрд░рдг: рдХрд░реНрдордЪрд╛рд░реА + рд╡рд░реНрд╖ + рдорд╣реАрдирд╛
SELECT EmployeeID , [Year] , [Month] , Monday = COUNT(CASE WHEN [WeekDay] = 'Monday' THEN 1 END) , ... , Sunday = COUNT(CASE WHEN [WeekDay] = 'Sunday' THEN 1 END) FROM ( SELECT EmployeeID , [Year] = YEAR(DateOut) , [Month] = MONTH(DateOut) , [WeekDay] = DATENAME(WEEKDAY, DateOut) FROM dbo.WorkOut ) t GROUP BY EmployeeID, [Year], [Month]
SQL рд╕рд░реНрд╡рд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
рд╕реАрдкреАрдпреВ рд╕рдордп = 6365 рдПрдордПрд╕, рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 9979 рдПрдордПрд╕ред SELECT * FROM ( SELECT EmployeeID , [Year] = YEAR(DateOut) , [Month] = MONTH(DateOut) , [WeekDay] = DATENAME(WEEKDAY, DateOut) FROM dbo.WorkOut ) t PIVOT ( COUNT([WeekDay]) FOR [WeekDay] IN ( Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday ) ) p
SQL рд╕рд░реНрд╡рд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:
рд╕реАрдкреАрдпреВ рд╕рдордп = 6193 рдПрдордПрд╕, рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп = 9861 рдПрдордПрд╕редрддрдереНрдп рдХреА рдмрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реНрдерд┐рддрд┐ рдЦреБрдж рдХреЛ рджреЛрд╣рд░рд╛рддреА рд╣реИ -
SQL рд╕рд░реНрд╡рд░ PIVOT рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд░рдирдЯрд╛рдЗрдо рдлрд┐рд░ рд╕реЗ рдЕрдкрдиреА рдЬрдЧрд╣ рдкрд░ рд╕рдм рдХреБрдЫ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдЫреЛрдЯреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ,
PIVOT рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ,
рдЖрдк рд╕реНрддрдВрднреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рдЯрд┐рдкреНрдкрдгреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ: рдЙрди рд╕реНрддрдВрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдПрдХрддреНрд░реАрдХрд░рдг рдмрдврд╝рддрд╛ рд╣реИ, PIVOT рдФрд░ CASE WHEN рдХреЗ рдмреАрдЪ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдореЗрдВ рдЕрдВрддрд░ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдкрд░ рдорд╛рдк рддреНрд░реБрдЯрд┐ рдХреЗ рднреАрддрд░ рд╣реЛрдЧрд╛ред
рд╕рднреА рдкреНрд░рдпреЛрдЧ
SQL рд╕рд░реНрд╡рд░ 2012 SP1 (11.00.3128) рдкрд░ рдХрд┐рдП рдЧрдП рдереЗред