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

कॉलम में पंक्तियाँ

इस प्रकार के डेटा के लिए, आपको UNPIVOT . दोनों को लागू करने की आवश्यकता होगी और फिर PIVOT SQL सर्वर के कार्य। UNPIVOT आपके डेटा को कई कॉलम से लेता है और इसे दो कॉलम में रखता है और फिर आप PIVOT . लागू करते हैं डेटा को वापस कॉलम में बदलने के लिए।

यदि आप उन सभी मूल्यों को जानते हैं जिन्हें आप बदलना चाहते हैं, तो आप इसे इसी तरह से हार्ड-कोड कर सकते हैं:

select *
from
(
  select value, col+'_'+cast(rn as varchar(10)) col
  from
  (
    select nvrchildname,
      nvrgender,
      convert(varchar(10), dttchildDOB, 120) dttchildDOB,
      occupation,
      row_number() over(partition by intsid order by intCHID) rn
    from tblHRIS_ChildDetails
    where intsid = 463
  ) src
  unpivot
  (
    value 
    for col in (nvrchildname, nvrgender, dttchildDOB, occupation)
  ) unpiv
) src1
pivot
(
  max(value)
  for col in ([nvrchildname_1], [nvrgender_1], 
              [dttchildDOB_1], [occupation_1], 
              [nvrchildname_2], [nvrgender_2], 
              [dttchildDOB_2], [occupation_2]) 
) piv

देखें SQL Fiddle with Demo

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

DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('tblHRIS_ChildDetails') and
               C.name not in ('intCHID', 'intsid')
         for xml path('')), 1, 1, '')

select @colsPivot = STUFF((SELECT  ',' 
                      + quotename(c.name 
                         +'_'+ cast(t.rn as varchar(10)))
                    from 
                    (
                      select row_number() over(partition by intsid order by intCHID) rn
                      from tblHRIS_ChildDetails
                    ) t
                    cross apply sys.columns as C
                   where C.object_id = object_id('tblHRIS_ChildDetails') and
                         C.name not in ('intCHID', 'intsid')
                   group by c.name, t.rn
                   order by t.rn
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query 
  = 'select *
      from
      (
        select col+''_''+cast(rn as varchar(10)) col, value
        from 
        (
          select nvrchildname,
            nvrgender,
            convert(varchar(10), dttchildDOB, 120) dttchildDOB,
            occupation,
            row_number() over(partition by intsid order by intCHID) rn
          from tblHRIS_ChildDetails
          where intsid = 463
        ) x
        unpivot
        (
          value
          for col in ('+ @colsunpivot +')
        ) u
      ) x1
      pivot
      (
        max(value)
        for col in  ('+ @colspivot +')
      ) p'

exec(@query)

देखें SQL Fiddle with Demo

दोनों प्रश्नों का परिणाम है:

| NVRCHILDNAME_1 | NVRGENDER_1 | DTTCHILDDOB_1 | OCCUPATION_1 | NVRCHILDNAME_2 | NVRGENDER_2 | DTTCHILDDOB_2 | OCCUPATION_2 |
-----------------------------------------------------------------------------------------------------------------------------
|             SK |      Female |    2001-12-11 |     Studying |             SM |        Male |    2007-10-08 |      Student |


  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 Server 2008 TIME कॉलम का उपयोग करना

  2. क्या मुझे वास्तव में SET XACT_ABORT ON का उपयोग करने की आवश्यकता है?

  3. SQL सर्वर से चित्र बॉक्स में छवि कैसे लोड करें?

  4. मैं LIKE क्लॉज में वर्गाकार कोष्ठकों से कैसे बच सकता हूँ?

  5. bcp.exe आउटपुट में अमुद्रणीय वर्ण