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

MSSQL2008R2の集計関数なしのピボット

    PIVOT関数を使用して結果を取得できます。必要なのは、row_number()を使用することだけです。 助けるために。

    これの基本クエリは次のようになります:

    select skill_id, skill, parameter,
      row_number() over(partition by skill, skill_id order by skill_id) rn
    from yt;
    

    SQL Fiddle withDemo を参照してください。 。 row_number()を使用します skill内の各行に個別の値を適用します およびskill_id 、次に、この行番号の値をPIVOTの列として使用します。

    PIVOTが適用された完全なコードは次のようになります:

    select skill_id, skill,[Parameter_1], [Parameter_2], [Parameter_3]
    from 
    (
      select skill_id, skill, parameter,
        'Parameter_'+cast(row_number() over(partition by skill, skill_id 
                                         order by skill_id) as varchar(10)) rn
      from yt
    ) d
    pivot
    (
      max(parameter)
      for rn in ([Parameter_1], [Parameter_2], [Parameter_3])
    ) piv;
    

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

    あなたの場合、スキルごとに未知の数のパラメーターがあるようです。それが当てはまる場合は、動的SQLを使用して結果を取得する必要があります。

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Parameter_'
                              +cast(row_number() over(partition by skill, skill_id 
                                   order by skill_id) as varchar(10))) 
                        from yt
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT skill_id, skill,' + @cols + ' from 
                 (
                    select skill_id, skill, parameter,
                      ''Parameter_''+cast(row_number() over(partition by skill, skill_id 
                                       order by skill_id) as varchar(10)) rn
                    from yt
                ) x
                pivot 
                (
                    max(parameter)
                    for rn in (' + @cols + ')
                ) p '
    
    execute(@query);
    

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




    1. PHPとMySQLの比較パスワード

    2. Mysqldumpの定義者をスキップまたは無視する

    3. 労働時間を保存し、効率的に照会するための最良の方法

    4. Oracle-リテラルがフォーマット文字列エラーと一致しません