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

マトリックステーブルを作成するSQL

    これには、条件付き合計と動的SQLを使用する必要があります

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'SUM(CASE WHEN l.Item = ',
          id,
          ' THEN l.qty END) `',
          name, '`'
        )
      ) INTO @sql
    FROM ItemLIst;
    
    SET @sql = CONCAT('SELECT u.name, ', @sql, ' 
                         FROM OrderList l JOIN UserList u
                           ON l.User = u.id
                        GROUP BY u.name');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    出力:

    |  NAME |  APPLE | ORANGE | BANANA |   KIWI |  MANGO |
    ------------------------------------------------------
    | James | (null) | (null) | (null) | (null) |      1 |
    |  John | (null) |      2 |      3 |      1 | (null) |
    |  Mary |      4 |      2 | (null) | (null) | (null) |
    

    これがSQLFiddle です。 デモ

    これで、ビューにラップすることはできなくなりますが、ストアドプロシージャにすることはできます。

    DELIMITER $$
    CREATE PROCEDURE sp_order_report()
    BEGIN
      SET @sql = NULL;
      SELECT
        GROUP_CONCAT(DISTINCT
          CONCAT(
            'SUM(CASE WHEN l.Item = ',
            id,
            ' THEN l.qty END) `',
            name, '`'
          )
        ) INTO @sql
      FROM
        ItemLIst;
      SET @sql = CONCAT('SELECT u.name, ', @sql, ' 
                           FROM OrderList l JOIN UserList u
                             ON l.User = u.id
                          GROUP BY u.name');
    
      PREPARE stmt FROM @sql;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
    END$$
    DELIMITER ;
    

    そして、次のように使用します:

    CALL sp_order_report();
    

    こちらがSQLFiddle です。 デモ




    1. パフォーマンスの神話:テーブル変数は常にメモリ内にあります

    2. MySQLエラーコード:1064。SQL構文にエラーがあります

    3. nodejsでSQLインジェクションを防ぎ、続編する方法は?

    4. MySQLでは、GROUP_CONCATから1024文字を超える文字を取得することは可能ですか?