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

SQL Server 2005 で列を行として表示する

    必要な結果を得るには、最初に UNPIVOT する必要があります データとPIVOT the DatePeriod`値。

    UNPIVOT は Transactions の複数の列を変換します 、 CustomersVisits 複数の行に。他の答えは 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 the を適用できます。 関数を 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 を参照してください。 .両方とも結果が得られます:

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

    1. ORDERBYクエリを最適化する

    2. MariaDBでのLPAD()のしくみ

    3. MySQLでのUCASE()関数のしくみ

    4. ストアドプロシージャを実行するためのHibernate4のネイティブOracleConnectionへのハンドルの取得