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

動的列を持つピボットMySQLテーブル

    あなたのmonth_paymentだと思います 列はDATE (ところで、SHOW CREATE TABLEを投稿する必要があります SQLの質問をするときは、推測する必要はありません)。

    ただし、最初のクエリはそれを年/月にフォーマットしていません。また、日付範囲を制限するものでもありません。

    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'SUM(CASE WHEN EXTRACT(YEAR_MONTH FROM month_payment) = ',
          EXTRACT(YEAR_MONTH FROM month_payment),
          ' THEN AMOUNT END) AS `',
          EXTRACT(YEAR_MONTH FROM month_payment),
          '`'
        )
      ) INTO @sql
    FROM record_payment
    WHERE month_payment BETWEEN ? AND ?
    

    https://devを参照してください。 mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_extract

    Barmarの提案にもかかわらず、これをストアドプロシージャに入れる理由はありません。質問にPHPのタグを付けましたが、これはPHPでも問題なく実行できます:

    <?php
    
    ...get a PDO connection...
    
    $sql = "
        SELECT
          GROUP_CONCAT(DISTINCT
            CONCAT(
              'SUM(CASE WHEN EXTRACT(YEAR_MONTH FROM month_payment) = ',
              EXTRACT(YEAR_MONTH FROM month_payment),
              ' THEN AMOUNT END) AS `',
              EXTRACT(YEAR_MONTH FROM month_payment),
              '`'
            )
          ) AS `pivot_columns`
        FROM record_payment
        WHERE month_payment BETWEEN ? AND ?
    ";
    $stmt = $pdo->prepare($sql);
    $date_from = '2017-01-01';
    $date_to   = '2017-08-01';
    $stmt->execute([$date_from, $date_to]);
    $row = $stmt->fetch();
    $stmt->closeCursor();
    $pivot_columns = $row['pivot_columns'];
    
    $sql = "
        SELECT title AS `Payment Method`, {$pivot_columns}
        FROM record_payment t1
        JOIN setting_payment_method spm ON spm.id = t1.method_id
        WHERE month_payment BETWEEN ? AND ?
        GROUP BY title WITH ROLLUP
    ";
    echo $sql;
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$date_from, $date_to]);
    $results = $stmt->fetchAll();
    $stmt->closeCursor();
    
    print_r($results);
    



    1. codeigniterのアクティブレコードパターンを使用したUNIONクエリ

    2. DESCの順序でグループ化する方法

    3. SQLを使用してMySQLデータベースの最初または最後の数文字を削除またはトリミングする

    4. SQLサーバーの接続タイムアウト