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

動的テーブルの転置の SQL クエリ

    あなたの場合、列 Salary, NoticePeriod, CTC のピボットを解除する必要があります 行、次に PIVOT :

    WITH Unpivoted
    AS
    (
        SELECT Name, Fields, SalaryValue
        FROM salaries AS s
        UNPIVOT
        (
          SalaryValue
          FOR  Fields IN(Salary, NoticePeriod, CTC)
        ) AS u
    )
    SELECT Fields, jack,bruce
    FROM Unpivoted AS u
    PIVOT
    (
      MAX(SalaryValue)
      FOR Name IN(Jack, Bruce)
    ) AS p;
    

    UNPIVOTSalary, NoticePeriod, CTC を変換します 値に:

    次に、ピボットは各フィールド値の給与値をピボットし、名前を列に変換します。

    もちろん、次のように名前のリストを記述する代わりに、動的に実行する必要があります:

    DECLARE @cols AS NVARCHAR(MAX);
    DECLARE @colnames AS NVARCHAR(MAX);
    DECLARE @query AS NVARCHAR(MAX);
    
    SELECT @cols = STUFF((SELECT distinct ',' +
                            QUOTENAME(name)
                           FROM salaries
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                            , 1, 1, '');
    
    
    SELECT @query = 'WITH Unpivoted
                    AS
                    (
                        SELECT Name, Fields, SalaryValue
                        FROM salaries AS s
                        UNPIVOT
                        (
                            SalaryValue
                            FOR  Fields IN(Salary, NoticePeriod, CTC)
                        ) AS u
                    )
                    SELECT Fields, ' + @cols + '
                    FROM Unpivoted AS u
                    PIVOT
                    (
                        MAX(SalaryValue)
                        FOR Name IN(' + @cols + ')' +
                    ') p';
    
    execute(@query);
    

    これにより以下が得られます:




    1. 動的タブは同じレコードを表示しています

    2. MySQLデータベースをメモリ内で完全に実行するにはどうすればよいですか?

    3. メール本文を保存するためのMySqlフィールドサイズ

    4. MySqlクエリを使用してデータベース内の数値を小数点以下2桁に丸める方法