sql >> Database >  >> RDS >> Mysql

Draai MySQL-tabel met dynamische kolommen

Ik denk dat je month_payment kolom is een DATE (btw, zou de SHOW CREATE TABLE moeten plaatsen wanneer u SQL-vragen stelt, zodat we niet hoeven te raden).

Maar uw eerste vraag formatteert dat niet naar het jaar/de maand. Het beperkt ook niet het datumbereik.

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 ?

Zie https://dev. mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_extract

Ondanks de suggestie van Barmar is er geen reden om dit in een opgeslagen procedure op te nemen. Je hebt je vraag getagd met PHP, en je kunt dit prima in PHP doen:

<?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. Hoe een gebruiker aan te maken in PostgreSQL

  2. Time-out voor Oracle 10g-databaseverbinding instellen in Java

  3. Passagiersfoutbibliotheek niet geladen

  4. MySQL-substringovereenkomst met behulp van reguliere expressie; substring bevatten 'man' niet 'vrouw'