sql >> データベース >  >> RDS >> Sqlserver

行を列に

    このタイプのデータの場合、両方の UNPIVOT を実装する必要があります そして PIVOT SQL Server の機能。 UNPIVOT 複数の列からデータを取得して 2 つの列に配置し、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 を参照してください。

    変換する値の数が不明な場合は、動的 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 を参照してください。

    両方のクエリの結果は次のとおりです:

    <プレ>| 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. Androidアプリを外部のMySQLデータベースと通信させる方法

    2. MySQLの変更テーブル変更列がnull値の行で失敗する

    3. JPA、EclipseLink、大文字と小文字を区別するmysqlの問題

    4. ZendDbSelectのJOINLEFTを使用したGROUP_CONCAT