年ごとに個別の列を作成する場合は、年を追加する必要があります(列のdate
から計算) )動的SQLコードへ:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
BEGIN
SET group_concat_max_len=2048;
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT(
'MAX(IF(month = ''',
month,
''' and year(date) = ',
year(date),
', amount, NULL)) AS `',
month,
'_',
year(date),
'`'
)
order by date
) INTO @sql
FROM tmp_results;
if coalesce(@sql,'') != '' then
set @sql = concat(', ', @sql);
end if;
SET @sql = CONCAT(
'SELECT r.account,
r.region ',
coalesce(@sql,''),
' FROM tmp_results r
LEFT JOIN accounts AS a
on r.account_id = a.id
GROUP BY r.account, r.region');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
列の名前はJanuary_2017
のようになります。 、およびorder by date
を追加しました 、そうでない場合、通常は順序付けされていません。
group by r.region
を追加しました 、それ以外の場合は、only_full_group_by
の場合は機能しません サーバーで有効になっています(これはMySQL 5.7以降のデフォルト値です)。
そして、空のテーブルのテストを追加しました(そうしないとエラーが発生します)。それが不要で、私のコードの一部だけを自分のコードにコピーする場合は、r.region
の後にコンマがないことに注意してください。 SET @sql = CONCAT('SELECT r.account, r.region '
コードと比較すると、コードを再度追加する必要がある場合があります。
毎月のコードの長さは約80なので、group_concat_max_len
を増やす必要がある場合があります 可能な限り最大のクエリに合わせます。