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

बिना समुच्चय वाली पंक्तियों और स्तंभों को स्थानांतरित करें

यदि आप PIVOT . लागू करने जा रहे हैं फ़ंक्शन, आपको परिणाम प्राप्त करने के लिए एक समग्र फ़ंक्शन का उपयोग करने की आवश्यकता होगी, लेकिन आप row_number() जैसे विंडोिंग फ़ंक्शन का भी उपयोग करना चाहेंगे। खाते में प्रत्येक संपर्क के लिए एक अद्वितीय अनुक्रम उत्पन्न करने के लिए।

सबसे पहले, आप अपने डेटा को इसी तरह क्वेरी करेंगे:

select account, contact,
  'contact'
    + cast(row_number() over(partition by account
                              order by contact) as varchar(10)) seq
from yourtable

डेमो के साथ SQL Fiddle देखें। यह अद्वितीय अनुक्रम के साथ एक नया कॉलम बनाएगा:

| ACCOUNT |   CONTACT |      SEQ |
|---------|-----------|----------|
|       1 | 324324324 | contact1 |
|       1 | 674323234 | contact2 |

यदि आपके पास सीमित संख्या में कॉलम हैं, तो आप अपनी क्वेरी को हार्ड-कोड कर सकते हैं:

select account,
  contact1, contact2, contact3, contact4
from 
(
  select account, contact,
    'contact'
      + cast(row_number() over(partition by account
                                order by contact) as varchar(10)) seq
  from yourtable
) d
pivot
(
  max(contact)
  for seq in (contact1, contact2, contact3, contact4)
) piv;

डेमो के साथ SQL Fiddle देखें

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

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

select @cols = STUFF((SELECT ',' + QUOTENAME(seq) 
                    from
                    (
                      select 'contact'
                              + cast(row_number() over(partition by account
                                                        order by contact) as varchar(10)) seq
                      from yourtable
                    ) d
                    group by seq
                    order by seq
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT account, ' + @cols + ' 
            from 
            (
                select account, contact,
                  ''contact''
                    + cast(row_number() over(partition by account
                                              order by contact) as varchar(10)) seq
                from yourtable
            ) x
            pivot 
            (
                max(contact)
                for seq in (' + @cols + ')
            ) p '

execute sp_executesql @query;

डेमो के साथ SQL Fiddle देखें। दोनों आपको इसका परिणाम देंगे:

| ACCOUNT |  CONTACT1 |  CONTACT2 |  CONTACT3 |  CONTACT4 |
|---------|-----------|-----------|-----------|-----------|
|       1 | 324324324 | 674323234 |    (null) |    (null) |
|       2 | 433243443 | 833343432 |    (null) |    (null) |
|       3 | 787655455 |    (null) |    (null) |    (null) |
|       4 | 455435435 | 754327545 |    (null) |    (null) |
|       5 | 432432432 | 432433242 | 432455553 | 543544355 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर के लिए मावेन निर्भरता की स्थापना

  2. ऐसे मान कैसे प्राप्त करें जिनमें SQL सर्वर में संख्याएँ नहीं हैं

  3. SQL सर्वर में लिंक किए गए सर्वर से तालिका विशेषाधिकार लौटाएं (T-SQL उदाहरण)

  4. एंटिटी फ्रेमवर्क कोर 2.0:एक बार सार बेस क्लास को कैसे कॉन्फ़िगर करें

  5. SQL सर्वर में पुनरावर्ती क्वेरी