あなたの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);