Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Tabela przestawna MySQL z dynamicznymi kolumnami

Domyślam się, że Twoja month_payment kolumna to DATE (btw, należy opublikować SHOW CREATE TABLE kiedy zadajesz pytania SQL, więc nie musimy zgadywać).

Ale twoje pierwsze zapytanie nie formatuje tego do roku/miesiąca. Nie ogranicza też zakresu dat.

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 ?

Zobacz https://dev. mysql.com/doc/refman/5.7/en/data-i-godzina-funkcje.html#function_extract

Pomimo sugestii Barmara, nie ma powodu, aby umieszczać to w procedurze składowanej. Otagowałeś swoje pytanie za pomocą PHP i możesz to zrobić dobrze w 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CONVERT_TZ() Przykłady – MySQL

  2. Jak rozwiązać Uwaga:Niezdefiniowany indeks:id w C:\xampp\htdocs\invmgt\manufactured_goods\change.php w wierszu 21

  3. Jak zresetować numer/kolumnę automatycznego przyrostu w tabeli MySql?

  4. MySQL UPDATE z losową liczbą od 1 do 3

  5. mysql zmień kolumnę int na bigint za pomocą kluczy obcych