यह वास्तव में एक धुरी है, जिसे क्रॉसस्टैब भी कहा जाता है, या कभी-कभी स्थानांतरित होता है
कुछ डेटाबेस में इसे करने के लिए समर्पित सुविधाएं हैं, अन्य को आपको ग्रुपिंग सिंटैक्स का उपयोग करना होगा। मैं बाद वाले को पसंद करता हूं क्योंकि यह सार्वभौमिक रूप से काम करता है
अगर यह कोई सांत्वना है, तो आप वाकई करीब थे!
SELECT
DIM_KEY,
MAX(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) as UPC,
MAX(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END) as DAIRY_CLM,
MAX(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END) as KOSHER_CLM,
MAX(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END) as FAT,
MAX(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END) as CALORIES
FROM demo
GROUP BY DIM_KEY
यह कैसे काम करता है?
ठीक है, यदि आप गैर-समूहीकृत, अधिकतम-फ़ंक्शन संस्करण नहीं चलाते हैं जो आपके पास पहले से था:
SELECT
DIM_KEY,
(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM
demo
तब आप देखेंगे कि आपका डेटा "विकर्ण" हो गया है:
3005, 123423, null, null...
3005, null, N, null...
3005, null, null, Y ...
प्रत्येक कॉलम में (प्रति dim_key) केवल एक मान होता है, शेष शून्य होते हैं
GROUP BY और MAX में जोड़ने से ये एक ही पंक्ति में ढह जाते हैं क्योंकि MAX() कॉलम से केवल मान लौटाएगा और सभी नल गायब हो जाएंगे। यह एक समूह की एक आंतरिक संपत्ति है, कि पंक्ति डेटा "एक साथ नहीं रहता" - किसी विशेष DIM_KEY के समूह के भीतर, MAX (DAIRY_CLM) किसी भी पंक्ति से आ सकता है, MAX (KOSHER_CLM) किसी भी अन्य पंक्ति से आ सकता है। व्यवहार में इसका मतलब है कि एकल मान चुने जाते हैं, नल छोड़ दिए जाते हैं, वे सभी एक ही पंक्ति में दिखाई देते हैं..
..और इस प्रकार आपका लंबवत डेटा विकर्ण से गुजरने के बाद क्षैतिज हो गया