जब आप गतिशील या अज्ञात मान को पिवट करने का प्रयास कर रहे हों, तो मैं हमेशा सुझाव दूंगा कि आप पहले क्वेरी के स्थिर या हार्ड-कोडेड संस्करण से शुरू करें, फिर इसे गतिशील SQL में परिवर्तित करें।
MySQL में PIVOT फ़ंक्शन नहीं है, इसलिए परिणाम प्राप्त करने के लिए आपको CASE अभिव्यक्ति के साथ एक समग्र फ़ंक्शन का उपयोग करने की आवश्यकता होगी। कोड का स्थिर संस्करण निम्न के जैसा होगा:
select t.id teamid,
t.name teamname,
p.id processid,
p.name processname,
max(case when pd.keyname = 'shape' then tpd.value end) shape,
max(case when pd.keyname = 'vegetable' then tpd.value end) vegetable,
max(case when pd.keyname = 'fruit' then tpd.value end) fruit,
max(case when pd.keyname = 'animal' then tpd.value end) animal
from teams t
inner join teamprocesses tp
on t.id = tp.teamid
inner join TeamProcessDetails tpd
on tp.id = tpd.teamProcessId
inner join processes p
on tp.processid = p.id
inner join processdetails pd
on p.id = pd.processid
and tpd.processDetailsid = pd.id
group by t.id, t.name, p.id, p.name;
देखें SQL Fiddle with Demo ।
अब अगर आपके पास keynames
. का कोई अनजान नंबर होने वाला है कि आप कॉलम में कनवर्ट करना चाहते हैं, तो आपको तैयार बयान
गतिशील एसक्यूएल उत्पन्न करने के लिए। कोड इसके समान होगा:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when pd.keyname = ''',
keyname,
''' then tpd.value end) AS ',
replace(keyname, ' ', '')
)
) INTO @sql
from ProcessDetails;
SET @sql
= CONCAT('SELECT t.id teamid,
t.name teamname,
p.id processid,
p.name processname, ', @sql, '
from teams t
inner join teamprocesses tp
on t.id = tp.teamid
inner join TeamProcessDetails tpd
on tp.id = tpd.teamProcessId
inner join processes p
on tp.processid = p.id
inner join processdetails pd
on p.id = pd.processid
and tpd.processDetailsid = pd.id
group by t.id, t.name, p.id, p.name;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
देखें SQL Fiddle with Demo ।
ध्यान रखने वाली एक बात GROUP_CONCAT
कॉलम की स्ट्रिंग बनाने के लिए फ़ंक्शन की डिफ़ॉल्ट अधिकतम लंबाई 1024 है, इसलिए यदि आपके पास इस स्ट्रिंग में बहुत सारे वर्ण होने जा रहे हैं तो आपको group_concat_max_len
के सत्र मान को बदलना पड़ सकता है। ।
यह क्वेरी एक परिणाम देगी:
| TEAMID | TEAMNAME | PROCESSID | PROCESSNAME | SHAPE | VEGETABLE | FRUIT | ANIMAL |
| 1 | teamA | 1 | processA | circle | carrot | apple | (null) |
| 1 | teamA | 2 | processB | (null) | (null) | (null) | dog |