ایس کیو ایل پیوٹ: قطاریں کالموں میں گھوم رہی ہیں۔

Mysql Pivot Rotating Rows Columns



ڈیٹا بیس ٹیبل مختلف اقسام کے ڈیٹا کو محفوظ کر سکتا ہے اور بعض اوقات ہمیں قطار کے ڈیٹا کو کالم لیول کے ڈیٹا میں تبدیل کرنے کی ضرورت ہوتی ہے۔ یہ مسئلہ PIVOT () فنکشن کے ذریعے حل کیا جا سکتا ہے۔ یہ فنکشن ٹیبل کی قطاروں کو کالم ویلیوز میں گھمانے کے لیے استعمال ہوتا ہے۔ لیکن یہ فنکشن بہت کم ڈیٹا بیس سرورز کی طرف سے سپورٹ کیا جاتا ہے ، جیسے اوریکل یا ایس کیو ایل سرور۔ اگر آپ MySQL ڈیٹا بیس ٹیبل میں وہی کام کرنا چاہتے ہیں تو آپ کو CASE بیان کا استعمال کرتے ہوئے SELECT سوال لکھنا ہوگا تاکہ قطاروں کو کالموں میں گھمائیں۔ مضمون متعلقہ ایس کیو ایل ڈیٹا بیس جدولوں میں PIVOT () فنکشن کا کام کرنے کا طریقہ دکھاتا ہے۔

شرط:

آپ کو ایک ڈیٹا بیس اور کچھ متعلقہ جدولیں بنانی ہوں گی جہاں ایک ٹیبل کی قطاریں کالموں میں بدل جائیں گی جیسے PIVOT () فنکشن۔ 'نامی ڈیٹا بیس بنانے کے لیے درج ذیل SQL بیانات چلائیں unidb 'اور تین میزیں بنائیں' طلباء '،' کورسز 'اور' نتیجہ '. طلباء اور نتیجہ جدولوں کا تعلق ایک سے کئی رشتوں سے ہوگا اور کورسز اور نتائج جدولوں کا تعلق ایک سے کئی تعلقات سے ہوگا۔ کا بیان بنائیں۔ نتیجہ ٹیبل میں فیلڈز کے لیے دو غیر ملکی کلیدی رکاوٹیں ہیں ، std_id ، اور کورس_ آئی ڈی .







ڈیٹا بیس unidb بنائیں
استعمال unidb

ٹیبل طلباء بنائیں۔(
آئی ڈیبنیادی کلید ،
نام varchar(پچاس)خالی نہیں ،
محکمہ ورچار(پندرہ)نہیں۔)؛

ٹیبل کورس بنائیں۔(
کورس_ڈ ورچار۔(بیس)بنیادی چابی،
نام varchar(پچاس)خالی نہیں ،
کریڈٹ چھوٹا نہیں۔)؛

ٹیبل کا نتیجہ بنائیں۔(
std_id مکمل نہیں ہے ،
کورس_ڈ ورچار۔(بیس)خالی نہیں ،
mark_type VARCHAR(بیس)خالی نہیں ،
چھوٹی چھوٹی نہیں ،
غیر ملکی چابی(std_id)طلباء کا حوالہ دیتے ہیں۔(آئی ڈی)،
غیر ملکی چابی(کورس_ آئی ڈی)حوالہ جات کورسز(کورس_ آئی ڈی)،
بنیادی چابی(std_id ، course_id ، mark_type۔))؛

میں کچھ ریکارڈ داخل کریں۔ طلباء ، کورس اور نتیجہ میزیں ٹیبل بنانے کے وقت مقرر کردہ پابندیوں کی بنیاد پر اقدار کو جدولوں میں داخل کیا جانا چاہیے۔



طلباء کی قیمتوں میں داخل کریں۔
( '1937463'،'ہارپر لی'،'سی ایس ای')،
( '1937464'،'گارسیا مارکیز'،'سی ایس ای')،
( '1937465'،'فورسٹر ، E.M.'،'سی ایس ای')،
( '1937466'،'رالف ایلیسن'،'سی ایس ای')؛

کورسز ویلیوز میں داخل کریں۔
( 'CSE-401'،'آبجیکٹ اورینٹڈ پروگرامنگ'،)،
( 'CSE-403'،'ڈیٹا سٹرکچر'،)،
( 'CSE-407'،'یونکس پروگرامنگ'،)؛

نتائج کی قیمتوں میں داخل کریں۔
( '1937463'،'CSE-401'،'اندرونی امتحان'،پندرہ)،
( '1937463'،'CSE-401'،'درمیانی مدت کے امتحانات'،بیس)،
( '1937463'،'CSE-401'،'حتمی امتحان'،35۔)،
( '1937464'،'CSE-403'،'اندرونی امتحان'،17۔)،
( '1937464'،'CSE-403'،'درمیانی مدت کے امتحانات'،پندرہ)،
( '1937464'،'CSE-403'،'حتمی امتحان'،30۔)،
( '1937465'،'CSE-401'،'اندرونی امتحان'،18۔)،
( '1937465'،'CSE-401'،'درمیانی مدت کے امتحانات'،2. 3۔)،
( '1937465'،'CSE-401'،'حتمی امتحان'،38۔)،
( '1937466'،'CSE-407'،'اندرونی امتحان'،بیس)،
( '1937466'،'CSE-407'،'درمیانی مدت کے امتحانات'،22۔)،
( '1937466'،'CSE-407'،'حتمی امتحان'،40۔)؛

یہاں ، نتیجہ ٹیبل میں ایک جیسی متعدد اقدار ہیں۔ std_id ، mark_type اور کورس_ آئی ڈی ہر قطار میں کالم. ڈیٹا کو زیادہ منظم شکل میں دکھانے کے لیے ان قطاروں کو اس ٹیبل کے کالموں میں کیسے تبدیل کیا جائے اس ٹیوٹوریل کے اگلے حصے میں دکھایا گیا ہے۔



CASE بیان کا استعمال کرتے ہوئے قطاروں کو کالموں میں گھمائیں:

کے تمام ریکارڈز کو ظاہر کرنے کے لیے درج ذیل سادہ SELECT بیان کو چلائیں۔ نتیجہ ٹیبل.





منتخب کریں*نتیجہ سے؛

آؤٹ پٹ تین کورس کی تین اقسام کے چار طالب علموں کے نمبر دکھاتا ہے۔ تو کی اقدار std_id ، کورس_ آئی ڈی اور mark_type مختلف طلباء ، کورسز اور امتحان کی اقسام کے لیے کئی بار دہرایا جاتا ہے۔



آؤٹ پٹ زیادہ پڑھنے کے قابل ہو گا اگر SELECT سوال کو CASE اسٹیٹمنٹ کا استعمال کرتے ہوئے زیادہ موثر انداز میں لکھا جا سکے۔ CASE بیان کے ساتھ درج ذیل SELECT قطاروں کی دہرانے والی اقدار کو کالم کے ناموں میں بدل دے گا اور ٹیبلز کے مواد کو صارف کے لیے زیادہ قابل فہم شکل میں دکھائے گا۔

SELECT result.std_id ، result.course_id ،
زیادہ سے زیادہ(CASE WHEN result.mark_type ='اندرونی امتحان'پھر نتیجہ. نشانات ختم) 'اندرونی امتحان'،
زیادہ سے زیادہ(CASE WHEN result.mark_type ='درمیانی مدت کے امتحانات'پھر نتیجہ. نشانات ختم) 'درمیانی مدت کے امتحانات'،
زیادہ سے زیادہ(CASE WHEN result.mark_type ='حتمی امتحان'پھر نتیجہ. نشانات ختم) 'حتمی امتحان'
نتیجہ سے۔
GROUP BY result.std_id ، result.course_id
آرڈر برائے result.std_id ، result.course_id ASC

مندرجہ ذیل آؤٹ پٹ اوپر والے بیان کو چلانے کے بعد ظاہر ہوگا جو پچھلے آؤٹ پٹ سے زیادہ پڑھنے کے قابل ہے۔

CASE اور SUM () کا استعمال کرتے ہوئے قطاروں کو کالموں میں گھمائیں:

اگر آپ ٹیبل سے ہر طالب علم کے ہر کورس کی کل تعداد گننا چاہتے ہیں تو آپ کو مجموعی فنکشن استعمال کرنا ہوگا SUM () گروپ بذریعہ std_id اور کورس_ آئی ڈی کیس بیان کے ساتھ۔ مندرجہ ذیل استفسار SUM () فنکشن اور GROUP BY شق کے ساتھ پچھلی استفسار میں ترمیم کرکے بنایا گیا ہے۔

SELECT result.std_id ، result.course_id ،
زیادہ سے زیادہ(CASE WHEN result.mark_type ='اندرونی امتحان'پھر نتیجہ. نشانات ختم) 'اندرونی امتحان'،
زیادہ سے زیادہ(CASE WHEN result.mark_type ='درمیانی مدت کے امتحانات'پھر نتیجہ. نشانات ختم) 'درمیانی مدت کے امتحانات'،
زیادہ سے زیادہ(CASE WHEN result.mark_type ='حتمی امتحان'پھر نتیجہ. نشانات ختم) 'حتمی امتحان'،
خلاصہ(نتیجہ نشانات) جیسا کہکل۔
نتیجہ سے۔
GROUP BY result.std_id ، result.course_id
آرڈر برائے result.std_id ، result.course_id ASC

آؤٹ پٹ نام کا ایک نیا کالم دکھاتا ہے۔ کل۔ جو کہ ہر ایک طالب علم کی طرف سے حاصل کردہ ہر کورس کے تمام امتحان کی اقسام کے نمبروں کو ظاہر کر رہا ہے۔

قطاروں کو کئی جدولوں میں کالموں میں گھمائیں:

پچھلے دو سوالات پر لاگو ہوتے ہیں نتیجہ ٹیبل. یہ میز دیگر دو جدولوں سے متعلق ہے۔ یہ ہیں طلباء اور کورسز . اگر آپ اسٹوڈنٹ آئی ڈی کے بجائے طالب علم کا نام اور کورس آئی ڈی کے بجائے کورس کا نام ظاہر کرنا چاہتے ہیں تو آپ کو تین متعلقہ جدولوں کا استعمال کرتے ہوئے SELECT سوال لکھنا ہوگا ، طلباء ، کورسز اور نتیجہ . مندرجہ ذیل SELECT استفسار کو FORM شق کے بعد تین جدولوں کے ناموں کو شامل کر کے اور WHERE شق میں مناسب شرائط مقرر کر کے بنایا گیا ہے تاکہ تینوں جدولوں سے ڈیٹا حاصل کیا جا سکے اور پچھلے SELECT سوالات کے مقابلے میں زیادہ مناسب پیداوار حاصل کی جا سکے۔

طلباء کا نام منتخب کریں۔جیسا کہ 'طالب علم کا نام'، کورسز کا نام۔جیسا کہ 'کورس کا نام۔'،
زیادہ سے زیادہ(CASE WHEN result.mark_type ='اندرونی امتحان'پھر نتیجہ. نشانات ختم) 'سی ٹی'،
زیادہ سے زیادہ(CASE WHEN result.mark_type ='درمیانی مدت کے امتحانات'پھر نتیجہ. نشانات ختم) 'وسط'،
زیادہ سے زیادہ(CASE WHEN result.mark_type ='حتمی امتحان'پھر نتیجہ. نشانات ختم) 'فائنل'،
خلاصہ(نتیجہ نشانات) جیسا کہکل۔
طلباء ، کورسز ، نتائج سے۔
WHERE result.std_id = students.id اور result.course_id = course.course_id
GROUP BY result.std_id ، result.course_id
آرڈر برائے result.std_id ، result.course_id ASC

مندرجہ بالا استفسار مندرجہ بالا استفسار پر عمل کرنے کے بعد پیدا ہوگا۔

نتیجہ:

آپ MySQL میں پیوٹ () فنکشن کی مدد کے بغیر پیوٹ () فنکشن کی فعالیت کو کس طرح نافذ کرسکتے ہیں اس مضمون میں کچھ ڈمی ڈیٹا استعمال کرکے دکھایا گیا ہے۔ مجھے امید ہے کہ قارئین اس مضمون کو پڑھنے کے بعد SELECT استفسار کا استعمال کرتے ہوئے قطار کے کسی بھی ڈیٹا کو کالم لیول کے ڈیٹا میں تبدیل کر سکیں گے۔