Nếu bạn cũng muốn có các cột riêng biệt cho các năm của mình, bạn phải thêm năm (được tính từ cột date
của bạn ) vào mã sql động của bạn:
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
Các cột sẽ được đặt tên như January_2017
và tôi đã thêm một order by date
, nếu không thì chúng thường không có thứ tự.
Tôi đã thêm một nhóm group by r.region
, nếu không, nó sẽ không hoạt động nếu only_full_group_by
được bật trên máy chủ của bạn (là giá trị mặc định bắt đầu với MySQL 5.7).
Và tôi đã thêm một bài kiểm tra cho các bảng trống (nếu không sẽ dẫn đến lỗi). Nếu bạn không cần nó và chỉ sao chép các phần mã của tôi vào mã của bạn, hãy lưu ý đến dấu phẩy bị thiếu sau r.region
trong SET @sql = CONCAT('SELECT r.account, r.region '
so với mã của bạn, bạn có thể phải thêm lại.
Vì mã cho mỗi tháng có độ dài khoảng 80, bạn có thể phải tăng group_concat_max_len
để phù hợp với truy vấn lớn nhất có thể của bạn.