Jika Anda ingin memiliki kolom terpisah untuk tahun Anda juga, Anda harus menambahkan tahun (dihitung dari kolom Anda date
) ke kode sql dinamis Anda:
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
Kolom akan diberi nama seperti January_2017
, dan saya menambahkan order by date
, jika tidak, mereka biasanya tidak berurutan.
Saya menambahkan group by r.region
, jika tidak maka tidak akan berfungsi jika only_full_group_by
diaktifkan di server Anda (yang merupakan nilai default yang dimulai dengan MySQL 5.7).
Dan saya menambahkan tes untuk tabel kosong (yang jika tidak akan menghasilkan kesalahan). Jika Anda tidak membutuhkannya dan hanya menyalin sebagian kode saya ke kode Anda, perhatikan koma yang hilang setelah r.region
di SET @sql = CONCAT('SELECT r.account, r.region '
dibandingkan dengan kode Anda, Anda mungkin harus menambahkannya lagi.
Karena kode untuk setiap bulan memiliki panjang sekitar 80, Anda mungkin harus menambah group_concat_max_len
agar sesuai dengan kueri terbesar Anda.