Một phần của vấn đề là bạn đã hủy chuẩn hóa dữ liệu trên nhiều cột mà bạn muốn xoay. Tốt nhất, bạn nên xem xét việc sửa cấu trúc bảng của mình để bạn dễ dàng bảo trì và truy vấn hơn. Nếu bạn không thể sửa cấu trúc bảng, thì bạn nên bỏ chia các cột trước rồi áp dụng PIVOT để có được kết quả cuối cùng.
Quá trình UNPIVOT sẽ lấy nhiều cột và chuyển chúng thành nhiều hàng. Tùy thuộc vào phiên bản SQL Server của bạn, có một số cách mà bạn có thể thực hiện việc này. Bạn có thể sử dụng hàm UNPIVOT hoặc vì bạn đang sử dụng SQL Server 2008, bạn có thể sử dụng ÁP DỤNG CHÉO với mệnh đề VALUES để bỏ chia.
Mã ÁP DỤNG / VALUES CROSS sẽ là:
select t.producttitle, c.col, c.value
from tmpData t
cross apply
(
values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
) c (col, value)
Xem SQL Fiddle with Demo . Thao tác này lấy nhiều cột của bạn và đặt dữ liệu vào định dạng tương tự như sau:
| PRODUCTTITLE | COL | VALUE |
-------------------------------
| Product 1 | Dec | 0 |
| Product 1 | Dec# | 0 |
| Product 1 | Nov | 0 |
| Product 1 | Nov# | 0 |
| Product 1 | Oct | 0 |
| Product 1 | Oct# | 0 |
| Product 1 | Sep | 0 |
| Product 1 | Sep# | 0 |
Khi dữ liệu ở định dạng này, bạn có thể áp dụng PIVOT cho các giá trị trong col
trong đó có các tên tháng:
select producttitle, jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#]
from
(
select t.producttitle, c.col, c.value
from tmpData t
cross apply
(
values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
) c (col, value)
) d
pivot
(
sum(value)
for col in (jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#])
) piv;
Xem SQL Fiddle với Demo . Điều này cho kết quả:
| PRODUCTTITLE | JAN | JAN# | FEB | FEB# | MAR | MAR# | APR | APR# | MAY | MAY# | JUN | JUN# | JUL | JUL# | AUG | AUG# | SEP | SEP# | OCT | OCT# | NOV | NOV# | DEC | DEC# |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Product 1 | 5 | 2 | 5 | 1 | 5 | 4 | 5 | 6 | 4.44 | 9 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Product 2 | 0 | 0 | 0 | 0 | 0 | 0 | 4.33 | 3 | 4.67 | 3 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Product 3 | 4.6 | 5 | 4.75 | 8 | 4.75 | 8 | 4 | 6 | 5 | 6 | 5 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |