برخی موارد نیاز داریم که یک مقدار چند ستونی را به چند ستونی تبدیل کنیم. این مورد در ساخت گزارشات کاربرد زیادی دارد. به عنوان مثال فرض کنید یک کوئری آماده دارید که توسط آن لیستی از تمام شیفت*های افراد به همراه نام قسمت*های مربوطه در یک سازمان ارائه می*شود. حال نیاز دارید بفهمید که هر کدام از قسمت*های سازمان در کدام شیفت، چند نفر کارمند دارد. عملا شما به یک جدول متقاطع نیاز دارید که ستون*های آن شامل نام قسمت*های مختلف سازمان و سطرهای آن نام شیفت*های مختلف می*باشد.
ابتدا شما را با گرامر عبارت مورد نظر آشنا میکنم :
کد PHP:
FROM table_source  
 
-- جدولیاکوئریمنبع PIVOTaggregate_functionvalue_column )   -- تابعتجمعیموردنظربههمراهستونموردنظر
 
FOR pivot_column   -- ستونیکهبرایساختننامستون*هااستفادهمی*شود IN( <column_list>)   -- مقادیریکهازستونبالابرایعملیاتانتخابمی*شود table_alias   -- ناممستعارجدولخروجی 

حال این مثال را پیاده*سازی می*کنیم، لطفا به کوئری اولیه توجه بفرمایید :

کد PHP:
SELECT s.Name ShiftName,
 
h.BusinessEntityIDd.Name DepartmentName FROM HumanResources.EmployeeDepartmentHistory h INNER JOIN HumanResources.Department d ON h.DepartmentID d.DepartmentID INNER JOIN HumanResources.Shift s ON h.ShiftID s.ShiftID WHERE EndDate IS NULL AND d.Name IN('Production''Engineering''Marketing'ORDER BY ShiftName 
خروجی این جدول لیستی از نام شیفت، شناسه کارمندان و نام قسمت مربوط می*باشد. به خروجی آن توجه کنید:
کد PHP:
ShiftName   BusinessEntityID   DepartmentName
Day              3                            Engineering
Day              9                            Engineering
...
Day              2                            Marketing
Day              6                            Marketing
...
Evening        25                          Production
Evening        18                          Production
Night            14                          Production
Night            27                          Production
...
Night            252                        Production
(194 row(saffected
حال برای تغییر دادن این کوئری به خروجی گزارش مورد نظر آن را به صورت زیر تغییر دهید:
کد PHP:
SELECT ShiftName,
 
ProductionEngineeringMarketing FROM (SELECT s.Name ShiftNameh.BusinessEntityIDd.Name DepartmentName FROM HumanResources.EmployeeDepartmentHistory h INNER JOIN HumanResources.Department d ON h.DepartmentID d.DepartmentID INNER JOIN HumanResources.Shift s ON h.ShiftID s.ShiftID WHERE EndDate IS NULL AND d.Name IN('Production''Engineering''Marketing')) AS a PIVOT COUNT(BusinessEntityID) FOR DepartmentName IN([Production], [Engineering], [Marketing]) ) AS b ORDER BY ShiftName