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

キー値を切り捨てる動的列を使用したMySQLピボットテーブルクエリ

    コードにはいくつかの問題があります-重力を減らすことによって:

    • z_tmp_admin_system_settingsからを選択する必要があります 、 from nameではありません
    • グループ化する列はcategoryと呼ばれます 、サブドメインではありません
    • クエリの原則は集計を使用することであるため、 MAX()などの生成された列の集計関数が必要です。;古いバージョンのMySQLは、集計されていない列で集計関数を使用しないことを許容しますが、それに慣れることはできません。
    • 名前の1つが予約語と衝突する場合に備えて、列の名前をバッククォートで囲むことをお勧めします(これはサンプルデータには当てはまりませんが、おそらく包括的ではありません)
    • >
    • DISTINCT name を複製していない限り、おそらく必要ありません。 ■カテゴリごと(この場合は、以下のコードに自由に追加してください)
    • 補足: IFNULL(...、NULL) ノーオペレーションです

    コード:

    SET SESSION group_concat_max_len = 100000;
    SET @sql = '';
    
    SELECT GROUP_CONCAT(
        CONCAT('MAX(IF(z_tmp_admin_system_settings.name = ''', name, ''', value, NULL)) AS `', name, '`')
    )
    INTO @sql
    FROM z_tmp_admin_system_settings;
    SET @sql = CONCAT(
        'SELECT category, ', 
        @sql, 
        ' FROM z_tmp_admin_system_settings GROUP BY category'
    );
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    DBフィドルのデモ

    | category | 2fa | abc_processing_date | activate_new_approve_person | activate_new_schdule | additional_footer_for_person |
    | -------- | --- | ------------------- | --------------------------- | -------------------- | ---------------------------- |
    | acme     | 0   | today               | 1                           | 1                    |                              |
    


    1. MySQLは列を一意ではないようにする必要があります。エラー「列名」を削除できません列/キーが存在することを確認してください

    2. pymysql.connectの実行時にエラーKeyerror255

    3. OracleRAC環境からのExpdp

    4. sequelize-cliを使用してmysqlの日付タイプの長さを設定する方法