Supongo que su month_payment
la columna es una DATE
(por cierto, debería publicar el SHOW CREATE TABLE
cuando hace preguntas de SQL para que no tengamos que adivinar).
Pero su primera consulta no es formatear eso al año/mes. Tampoco está limitando el rango de fechas.
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 ?
Consulte https://dev. mysql.com/doc/refman/5.7/en/fecha-y-hora-funciones.html#function_extract
A pesar de la sugerencia de Barmar, no hay razón para poner esto en un procedimiento almacenado. Etiquetaste tu pregunta con PHP, y puedes hacer esto en PHP muy bien:
<?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);