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

列の結果を単一の行に変換する

    PIVOT<を実行しようとしています。 / code> データ。 SQLサーバーにはPIVOTがあります これを実行できる関数。 PIVOTを実行するには 使用する集計関数を決定する必要があります。私のサンプルでは、​​ MAX()を使用しました ただし、 SUM()を使用できます 、など。

    ピボット関数がない場合は、 CASEで集計関数を使用できます。 これを行うためのステートメント。

    集計/ケースバージョン: このバージョンでは、すべての名前を列にハードコーディングする必要があります。

    select 
      max(case when name = 'Engineering' then rating end) Engineering,
      max(case when name = 'Financials' then rating end) Financials,
      max(case when name = 'Scope' then rating end) Scope,
      max(case when name = 'Schedule' then rating end) Schedule,
      max(case when name = 'Risks' then rating end) Risks,
      max(case when name = 'People' then rating end) People
    from yourtable
    

    SQL Fiddle withDemo を参照してください。

    静的PIVOTバージョン: 名前の値をこのクエリにハードコーディングします

    select *
    from
    (
      select name, rating
      from yourtable
    ) src
    pivot
    (
      max(rating)
      for name in ([Engineering], [Financials], [Scope],
                   [Schedule], [Risks], [People])
    ) piv
    

    SQL Fiddle withDemo を参照してください。

    上記のバージョンは、列の数がわかっている場合にうまく機能しますが、 name 値が不明な場合は、動的SQLを使用して PIVOTを実行できます データ。

    動的PIVOTバージョン:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name) 
                        from yourtable
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT ' + @cols + ' from 
                 (
                    select name, rating
                    from yourtable
                ) x
                pivot 
                (
                    max(rating)
                    for name in (' + @cols + ')
                ) p '
    
    execute(@query)
    

    SQL Fiddle withDemo を参照してください。

    3つのバージョンすべてで同じ結果が得られます:

    | ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
    ----------------------------------------------------------------
    |           1 |          3 |     1 |        2 |     3 |      3 |
    



    1. アプリケーションコードを再設計して、削減します。パフォーマンスの観点からのデータベースヒットの割合

    2. Oracle-WITH CLAUSE => MERGE? (構文エラー、 )

    3. 1行にデータを表示(複数行から)

    4. プログラムの一部でMySQLクエリキャッシュを明示的に無効にする