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

SQLは列の値をピボットします

    ウィンドウ関数と条件付き集計を使用できます:

    select
        rn,
        max(case when occupation = 'Doctor' then name end) doctor,
        max(case when occupation = 'Singer' then name end) singer,
        max(case when occupation = 'Actor'  then name end) actor
    from (
        select t.*, row_number() over(partition by occupation order by name) rn
        from mytable t
    )
    group by rn
    

    サブクエリは、同じ職業を持つ人を名前でランク付けします。次に、その情報を使用して行を生成し、条件付き集計を使用して各職業に対応する名前にアクセスできます。

    ウィンドウ関数がなければ、それは異なります。データが大きすぎない場合、1つのオプションはサブクエリで行番号をエミュレートします:

    select
        rn,
        max(case when occupation = 'Doctor' then name end) doctor,
        max(case when occupation = 'Singer' then name end) singer,
        max(case when occupation = 'Actor'  then name end) actor
    from (
        select t.*, 
            (
                select count(*) 
                from mytable t1 
                where t1.occupation = t.occupation and t1.name <= t.name
            ) rn
        from mytable t
    )
    group by rn
    



    1. JDBCタイプの方言マッピングなし:-9

    2. Python:mysqldbを使用してMySQLテーブルをディクショナリとしてインポートしますか?

    3. TOAD for Oracleから関数を実行し、その結果をデータグリッドにバインドするにはどうすればよいですか。

    4. ルートモデルバインディングが機能しない