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

SQL सर्वर 2005 में कॉलम को पंक्तियों के रूप में प्रदर्शित करना

वांछित परिणाम प्राप्त करने के लिए आपको पहले UNPIVOT . की आवश्यकता होगी डेटा और फिर PIVOT the DatePeriod` मान।

UNPIVOT Transactions . के कई स्तंभों को बदल देगा , Customers और Visits कई पंक्तियों में। अन्य उत्तर UNION ALL . का उपयोग कर रहे हैं अनपिवट करने के लिए लेकिन SQL Server 2005 पहला वर्ष था UNPIVOT समारोह समर्थित था।

डेटा को अनपिवट करने की क्वेरी है:

select dateperiod,
  col, value
from transactions
unpivot
(
  value for col in (Transactions, Customers, Visits)
) u

देखें डेमो . यह आपके वर्तमान कॉलम को कई पंक्तियों में बदल देता है, इसलिए डेटा निम्न जैसा दिखता है:

| DATEPERIOD |          COL | VALUE |
-------------------------------------
|   Jan 2012 | Transactions |   100 |
|   Jan 2012 |    Customers |    50 |
|   Jan 2012 |       Visits |   150 |
|   Feb 2012 | Transactions |   200 |

अब, चूंकि डेटा पंक्तियों में है, आप PIVOT . लागू कर सकते हैं DatePeriod . पर कार्य करें कॉलम:

select col, [Jan 2012], [Feb 2012], [Mar 2012]
from
(
  select dateperiod,
    t.col, value, c.SortOrder
  from
  (
    select dateperiod,
      col, value
    from transactions
    unpivot
    (
      value for col in (Transactions, Customers, Visits)
    ) u
  ) t
  inner join
  (
    select 'Transactions' col, 1 SortOrder
    union all
    select 'Customers' col, 2 SortOrder
    union all
    select 'Visits' col, 3 SortOrder
   ) c
    on t.col = c.col
) d
pivot
(
  sum(value)
  for dateperiod in ([Jan 2012], [Feb 2012], [Mar 2012])
) piv
order by SortOrder;

देखें SQL Fiddle with Demo

यदि आपके पास अज्ञात संख्या में दिनांक अवधि है तो आप गतिशील SQL का उपयोग करेंगे:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(dateperiod) 
                    from transactions
                    group by dateperiod, PeriodNumberOverall
                    order by PeriodNumberOverall
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT col, ' + @cols + ' 
             from 
             (
                select dateperiod,
                  t.col, value, c.SortOrder
                from
                (
                  select dateperiod,
                    col, value
                  from transactions
                  unpivot
                  (
                    value for col in (Transactions, Customers, Visits)
                  ) u
                ) t
                inner join
                (
                  select ''Transactions'' col, 1 SortOrder
                  union all
                  select ''Customers'' col, 2 SortOrder
                  union all
                  select ''Visits'' col, 3 SortOrder
                 ) c
                  on t.col = c.col
            ) x
            pivot 
            (
                sum(value)
                for dateperiod in (' + @cols + ')
            ) p 
            order by SortOrder'

execute(@query)

देखें SQL Fiddle with Demo . दोनों परिणाम देंगे:

|          COL | JAN 2012 | FEB 2012 | MAR 2012 |
-------------------------------------------------
| Transactions |      100 |      200 |      300 |
|    Customers |       50 |      100 |      200 |
|       Visits |      150 |      300 |      600 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टी-एसक्यूएल बिल्ट-इन फ़ंक्शन के साथ सबस्ट्रिंग कैसे प्राप्त करें

  2. SQL सर्वर में पदानुक्रमित संबंधों को एक साथ कैसे समूहित करें

  3. नया कॉलम जोड़ने के बाद SQL सर्वर अमान्य कॉलम नाम

  4. ब्रेंट ओजर SQL सर्वर आंतरिक और बाहरी विखंडन की व्याख्या करता है

  5. डेटाबेस की सभी मौजूदा संग्रहीत प्रक्रियाओं को कैसे एन्क्रिप्ट करें