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

कॉलम की अज्ञात संख्या को कैसे पिवट करें और SQL सर्वर में कोई कुल नहीं है?

जबकि M.Ali के उत्तर से आपको परिणाम मिलेगा, क्योंकि आप SQL Server 2012 का उपयोग कर रहे हैं, मैं name को अनपिवट कर दूंगा और address अंतिम परिणाम प्राप्त करने के लिए कॉलम थोड़े अलग हैं।

चूंकि आप SQL Server 2012 का उपयोग कर रहे हैं, आप CROSS APPLY . का उपयोग कर सकते हैं VALUES . के साथ इन एकाधिक स्तंभों को एकाधिक पंक्तियों में अनपिवट करने के लिए। लेकिन इससे पहले कि आप ऐसा करें, मैं row_number() . का उपयोग करूंगा आपके पास कुल नए कॉलम प्राप्त करने के लिए।

CROSS APPLY का उपयोग करके डेटा को "UNPIVOT" करने के लिए कोड ऐसा दिखता है:

select d.loanid, 
  col = c.col + cast(seq as varchar(10)),
  c.value
from
(
  select loanid, name, address,
    row_number() over(partition by loanid
                      order by loanid) seq
  from yourtable
) d
cross apply
(
  values
    ('name', name),
    ('address', address)
) c(col, value);

डेमो के साथ SQL Fiddle देखें। यह आपके डेटा को निम्न के समान प्रारूप में प्राप्त करने जा रहा है:

| LOANID |      COL |    VALUE |
|--------|----------|----------|
|      1 |    name1 |     John |
|      1 | address1 | New York |
|      1 |    name2 |     Carl |
|      1 | address2 | New York |
|      1 |    name3 |    Henry |
|      1 | address3 |   Boston |

अब आपके पास एक ही कॉलम है COL आपके सभी नए कॉलम नामों के साथ और संबद्ध मान भी एक ही कॉलम में हैं। नए कॉलम नामों में अब अंत में एक संख्या (1, 2, 3, आदि) होती है, जो इस आधार पर होती है कि आपके पास प्रति loanid में कुल कितनी प्रविष्टियां हैं। . अब आप PIVOT लागू कर सकते हैं:

select loanid,
  name1, address1, name2, address2,
  name3, address3
from
(
  select d.loanid, 
    col = c.col + cast(seq as varchar(10)),
    c.value
  from
  (
    select loanid, name, address,
      row_number() over(partition by loanid
                        order by loanid) seq
    from yourtable
  ) d
  cross apply
  (
    values
      ('name', name),
      ('address', address)
  ) c(col, value)
) src
pivot
(
  max(value)
  for col in (name1, address1, name2, address2,
              name3, address3)
) piv;

डेमो के साथ SQL Fiddle देखें। अंत में यदि आप नहीं जानते हैं कि Name . के कितने जोड़े हैं? और address आपके पास तब आप गतिशील SQL का उपयोग कर सकते हैं:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(seq as varchar(10))) 
                    from 
                    (
                      select row_number() over(partition by loanid
                                                order by loanid) seq
                      from yourtable
                    ) d
                    cross apply
                    (
                      select 'Name', 1 union all
                      select 'Address', 2
                    ) c (col, so)
                    group by seq, col, so
                    order by seq, so
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT loanid,' + @cols + ' 
            from 
            (
              select d.loanid, 
                col = c.col + cast(seq as varchar(10)),
                c.value
              from
              (
                select loanid, name, address,
                  row_number() over(partition by loanid
                                    order by loanid) seq
                from yourtable
              ) d
              cross apply
              (
                values
                  (''name'', name),
                  (''address'', address)
              ) c(col, value)
            ) x
            pivot 
            (
                max(value)
                for col in (' + @cols + ')
            ) p '

exec sp_executesql @query;

डेमो के साथ SQL Fiddle देखें। दोनों संस्करण एक परिणाम देते हैं:

| LOANID |  NAME1 | ADDRESS1 |  NAME2 | ADDRESS2 |  NAME3 | ADDRESS3 |
|--------|--------|----------|--------|----------|--------|----------|
|      1 |   John | New York |   Carl | New York |  Henry |   Boston |
|      2 | Robert |  Chicago | (null) |   (null) | (null) |   (null) |
|      3 | Joanne |       LA |  Chris |       LA | (null) |   (null) |


  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 सर्वर कर्सर के लिए चरणों को परिभाषित करें - SQL सर्वर / TSQL ट्यूटोरियल

  3. यह जांचने के 4 तरीके हैं कि SQL सर्वर (T-SQL) में छोड़ने से पहले कोई तालिका मौजूद है या नहीं

  4. एसक्यूएल सर्वर में पुनर्प्राप्त करने की तारीख, CURRENT_TIMESTAMP बनाम GetDate ()

  5. "क्वेरी प्रतीक्षा में अनुमति नहीं है" SQL सर्वर में त्रुटि 101