Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एसक्यूएल - एग्रीगेट्स के बिना कई कॉलम पिवट करें

समस्या का एक हिस्सा यह है कि आपने कई स्तंभों में डेटा को डी-सामान्यीकृत किया है जिसे आप पिवट करना चाहते हैं। आदर्श रूप से, आपको अपनी तालिका संरचना को ठीक करने पर विचार करना चाहिए ताकि आपके लिए इसे बनाए रखना और क्वेरी करना आसान हो जाए। यदि आप तालिका संरचना को ठीक करने में सक्षम नहीं हैं, तो आपको अंतिम परिणाम प्राप्त करने के लिए पहले कॉलम को अनपिवट करना चाहिए और फिर 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 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. VBA का उपयोग करके संग्रहीत कार्यविधि को कॉल करना

  2. SQL सर्वर 2008 में अल्पविराम द्वारा विभाजित कार्य

  3. इंटरनेट पर SQL सर्वर से SQL सर्वर में डेटा का सुरक्षित स्थानांतरण

  4. SQL सर्वर में sp_add_schedule बनाम sp_add_jobschedule:क्या अंतर है?

  5. SQL सर्वर में महीने का अंतिम दिन कैसे खोजें