समस्या का एक हिस्सा यह है कि आपने कई स्तंभों में डेटा को डी-सामान्यीकृत किया है जिसे आप पिवट करना चाहते हैं। आदर्श रूप से, आपको अपनी तालिका संरचना को ठीक करने पर विचार करना चाहिए ताकि आपके लिए इसे बनाए रखना और क्वेरी करना आसान हो जाए। यदि आप तालिका संरचना को ठीक करने में सक्षम नहीं हैं, तो आपको अंतिम परिणाम प्राप्त करने के लिए पहले कॉलम को अनपिवट करना चाहिए और फिर PIVOT लागू करना चाहिए।
UNPIVOT प्रक्रिया कई कॉलम लेगी और उन्हें कई पंक्तियों में बदल देगी। SQL सर्वर के आपके संस्करण के आधार पर आप ऐसा कुछ तरीके कर सकते हैं। आप UNPIVOT फ़ंक्शन का उपयोग कर सकते हैं या चूंकि आप SQL Server 2008 का उपयोग कर रहे हैं, आप अनपिवट करने के लिए VALUES क्लॉज के साथ CROSS APPLY का उपयोग कर सकते हैं।
क्रॉस लागू/मूल्य कोड होगा:
select t.producttitle, c.col, c.value
from tmpData t
cross apply
(
values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
) c (col, value)
देखें SQL Fiddle with Demo . यह आपके एकाधिक कॉलम लेता है और डेटा को इस तरह के प्रारूप में रखता है:
| 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 |
एक बार डेटा इस प्रारूप में होने के बाद आप PIVOT को col
. में मानों पर लागू कर सकते हैं जिसमें महीने के नाम शामिल हैं:
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;
देखें SQL Fiddle with Demo . यह एक परिणाम देता है:
| 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 |