यदि आप अपने वर्षों के लिए भी अलग कॉलम रखना चाहते हैं, तो आपको वर्ष जोड़ना होगा (आपके कॉलम 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
बढ़ाना पड़ सकता है आपकी सबसे बड़ी संभावित क्वेरी फिट करने के लिए।