MySQL Pivot: تدوير الصفوف إلى الأعمدة

Mysql Pivot Rotating Rows Columns



يمكن لجدول قاعدة البيانات تخزين أنواع مختلفة من البيانات وفي بعض الأحيان نحتاج إلى تحويل البيانات على مستوى الصف إلى بيانات على مستوى العمود. يمكن حل هذه المشكلة باستخدام وظيفة PIVOT (). تُستخدم هذه الوظيفة لتدوير صفوف الجدول إلى قيم الأعمدة. لكن هذه الوظيفة مدعومة من قبل عدد قليل جدًا من خوادم قواعد البيانات ، مثل Oracle أو SQL Server. إذا كنت تريد القيام بنفس المهمة في جدول قاعدة بيانات MySQL ، فعليك كتابة استعلام التحديد باستخدام عبارة CASE لتدوير الصفوف إلى أعمدة. يوضح المقال طريقة القيام بمهمة وظيفة PIVOT () ضمن جداول قاعدة بيانات MySQL ذات الصلة.

المتطلبات المسبقة:

يجب عليك إنشاء قاعدة بيانات وبعض الجداول ذات الصلة حيث سيتم تحويل صفوف جدول واحد إلى أعمدة مثل وظيفة PIVOT (). قم بتشغيل جمل SQL التالية لإنشاء قاعدة بيانات باسم أونيدب 'وإنشاء ثلاثة جداول باسم' الطلاب '،' الدورات ' و ' نتيجة '. الطلاب و نتيجة سوف ترتبط الجداول بعلاقة رأس بأطراف و الدورات و النتائج سوف ترتبط الجداول بعلاقة رأس بأطراف هنا. إنشاء بيان من نتيجة يحتوي الجدول على اثنين من قيود المفتاح الخارجي للحقول ، std_id ، و معرف بالطبع .







إنشاء قاعدة بيانات unidb ؛
استخدام unidb ؛

إنشاء الطلاب الجدول(
هوية شخصيةالمفتاح الأساسي الداخلي ،
اسم varchar(خمسون)غير فارغة،
قسم فاركار(خمسة عشر)غير فارغة)؛

إنشاء دورات الجدول(
course_id VARCHAR(عشرين)المفتاح الأساسي،
اسم varchar(خمسون)غير فارغة،
الائتمان SMALLINT NOT NULL)؛

نتيجة إنشاء الجدول(
std_id INT NOT NULL ،
course_id VARCHAR(عشرين)غير فارغة،
علامة_نوع VARCHAR(عشرين)غير فارغة،
علامة SMALLINT NOT NULL ،
مفتاح غريب(std_id)المراجع الطلاب(هوية شخصية)و
مفتاح غريب(معرف بالطبع)مراجع الدورات(معرف بالطبع)و
المفتاح الأساسي(std_id ، course_id ، mark_type))؛

أدخل بعض السجلات في الطلاب والدورات والنتيجة الجداول. يجب إدراج القيم في الجداول بناءً على القيود التي تم تعيينها في وقت إنشاء الجدول.



أدخل قيم الطلاب
( '1937463'و'هاربر لي'و'محرك بحث مخصص')و
( '1937464'و'جارسيا ماركيز'و'محرك بحث مخصص')و
( '1937465'و'فورستر ، إي إم'و'محرك بحث مخصص')و
( '1937466'و'رالف إليسون'و'محرك بحث مخصص')؛

أدخل قيم الدورات التدريبية
( 'CSE-401'و'البرمجة الشيئية'و3)و
( 'CSE-403'و'هيكل البيانات'و2)و
( 'CSE-407'و'برمجة يونكس'و2)؛

أدخل قيم النتائج
( '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 و نوع_الماركة و معرف بالطبع أعمدة في كل صف. يتم عرض كيفية تحويل هذه الصفوف إلى أعمدة في هذا الجدول لعرض البيانات بتنسيق أكثر تنظيماً في الجزء التالي من هذا البرنامج التعليمي.



تدوير الصفوف إلى الأعمدة باستخدام عبارة CASE:

قم بتشغيل عبارة SELECT البسيطة التالية لعرض كافة سجلات ملف نتيجة طاولة.





تحديد*من نتيجة ؛

يُظهر الإخراج علامات الطالب الأربعة لثلاثة أنواع من الاختبارات المكونة من ثلاث دورات. لذا فإن قيم std_id و معرف بالطبع و نوع_الماركة تتكرر عدة مرات لمختلف أنواع الطلاب والدورات والامتحانات.



سيكون الإخراج أكثر قابلية للقراءة إذا كان من الممكن كتابة استعلام SELECT بشكل أكثر كفاءة باستخدام عبارة CASE. سيحول SELECT التالي مع عبارة CASE القيم المتكررة للصفوف إلى أسماء الأعمدة ويعرض محتوى الجداول بتنسيق أكثر قابلية للفهم للمستخدم.

SELECT result.std_id، result.course_id،
الأعلى(الحالة عند النتيجة. mark_type ='امتحان داخلي'ثم النتيجة. علامات النهاية) 'امتحان داخلي'و
الأعلى(الحالة عند النتيجة. mark_type ='إختبار نصف الفصل'ثم النتيجة. علامات النهاية) 'إختبار نصف الفصل'و
الأعلى(الحالة عند النتيجة. mark_type ='إمتحان نهائي'ثم النتيجة. علامات النهاية) 'إمتحان نهائي'
من نتيجة
تجميع حسب النتيجة. std_id ، result.course_id
ORDER BY result.std_id، result.course_id ASC؛

سيظهر الإخراج التالي بعد تشغيل العبارة أعلاه والتي تكون أكثر قابلية للقراءة من الإخراج السابق.

تدوير الصفوف إلى أعمدة باستخدام CASE و SUM ():

إذا كنت تريد حساب العدد الإجمالي لكل دورة لكل طالب من الجدول ، فعليك استخدام وظيفة التجميع مجموع() مجموعة من std_id و معرف بالطبع مع بيان CASE. يتم إنشاء الاستعلام التالي عن طريق تعديل الاستعلام السابق باستخدام الدالة SUM () وعبارة GROUP BY.

SELECT result.std_id، result.course_id،
الأعلى(الحالة عند النتيجة. mark_type ='امتحان داخلي'ثم النتيجة. علامات النهاية) 'امتحان داخلي'و
الأعلى(الحالة عند النتيجة. mark_type ='إختبار نصف الفصل'ثم النتيجة. علامات النهاية) 'إختبار نصف الفصل'و
الأعلى(الحالة عند النتيجة. mark_type ='إمتحان نهائي'ثم النتيجة. علامات النهاية) 'إمتحان نهائي'و
مجموع(نتيجة) كماالمجموع
من نتيجة
تجميع حسب النتيجة. std_id ، result.course_id
ORDER BY result.std_id، result.course_id ASC؛

يظهر الإخراج عمودًا جديدًا يسمى المجموع يعرض مجموع علامات جميع أنواع الاختبارات لكل دورة حصل عليها كل طالب على حدة.

تدوير الصفوف إلى أعمدة في جداول متعددة:

يتم تطبيق الاستعلامين السابقين على نتيجة طاولة. يرتبط هذا الجدول بالجدولين الآخرين. وهذه هي الطلاب و الدورات . إذا كنت ترغب في عرض اسم الطالب بدلاً من معرف الطالب واسم الدورة التدريبية بدلاً من معرف الدورة التدريبية ، فيجب عليك كتابة استعلام SELECT باستخدام ثلاثة جداول مرتبطة ، الطلاب و الدورات و نتيجة . يتم إنشاء استعلام SELECT التالي عن طريق إضافة ثلاثة أسماء للجدول بعد عبارة FORM وتعيين الشروط المناسبة في جملة WHERE لاسترداد البيانات من الجداول الثلاثة وإنشاء إخراج أكثر ملاءمة من استعلامات SELECT السابقة.

حدد اسم الطلابكما 'أسم الطالب'، دوراتكما 'اسم الدورة التدريبية'و
الأعلى(الحالة عند النتيجة. mark_type ='امتحان داخلي'ثم النتيجة. علامات النهاية) 'CT'و
الأعلى(الحالة عند النتيجة. mark_type ='إختبار نصف الفصل'ثم النتيجة. علامات النهاية) 'منتصف'و
الأعلى(الحالة عند النتيجة. mark_type ='إمتحان نهائي'ثم النتيجة. علامات النهاية) 'أخير'و
مجموع(نتيجة) كماالمجموع
من الطلاب ، الدورات ، النتيجة
WHERE result.std_id = students.id و result.course_id = course.course_id
تجميع حسب النتيجة. std_id ، result.course_id
ORDER BY result.std_id، result.course_id ASC؛

سيتم إنشاء الإخراج التالي بعد تنفيذ الاستعلام أعلاه.

استنتاج:

كيف يمكنك تنفيذ وظيفة Pivot () دون دعم وظيفة Pivot () في MySQL موضحة في هذه المقالة باستخدام بعض البيانات الوهمية. آمل أن يتمكن القراء من تحويل أي بيانات على مستوى الصف إلى بيانات على مستوى العمود باستخدام استعلام التحديد بعد قراءة هذه المقالة.