0Pricing
SQL Academy · درس

أنماط Crosstab (PostgreSQL crosstab())

أنشئ جداول Pivot حقيقية باستخدام الدالة crosstab() من إضافة tablefunc.

أنماط Crosstab (PostgreSQL crosstab()) درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

لماذا نحتاج إلى crosstab فعلي؟

تتطلب التحويلات المحورية باستخدام CASE إدراج كل عمود مستهدف. أما التحويلات العريضة فعلاً، مثل إنشاء عمود لكل منتج، فالأداة المناسبة لها هي crosstab() من إضافة tablefunc.

تفعيل الإضافة

تأتي tablefunc ضمن إضافات PostgreSQL:

CREATE EXTENSION IF NOT EXISTS tablefunc;

توقيع crosstab الأساسي

تأخذ crosstab سلسلة SQL ذات ثلاثة أعمدة (row_key وcategory وvalue)، وتُرجع row_key وعموداً واحداً لكل فئة:

SELECT * FROM crosstab(
  $$
    SELECT user_id, status, COUNT(*)::INT
    FROM orders
    GROUP BY user_id, status
    ORDER BY user_id, status
  $$
) AS ct (
  user_id BIGINT,
  paid    INT,
  pending INT,
  cancelled INT
);

لماذا تصرّح عن أعمدة المخرجات؟

لغة SQL ثابتة الأنواع — لذلك يحتاج المخطط إلى معرفة أعمدة المخرجات عند تحليل الاستعلام. ولهذا تحدد المخطط في عبارة AS، بما في ذلك أنواع البيانات.

‏crosstab ذو الوسيطتين (مع مجموعة فئات)

بالنسبة إلى البيانات المتناثرة، مرّر قائمة الفئات بشكل منفصل حتى تصبح القيم المفقودة NULL بدلاً من التسبب في عدم تطابق الأعمدة:

SELECT * FROM crosstab(
  $$
    SELECT user_id, status, COUNT(*)::INT
    FROM orders GROUP BY user_id, status
    ORDER BY user_id
  $$,
  $$ VALUES ('paid'), ('pending'), ('cancelled') $$
) AS ct (
  user_id BIGINT, paid INT, pending INT, cancelled INT
);

متى يتفوق CASE على crosstab

بالنسبة إلى مجموعة صغيرة ومعروفة من الفئات، يكون CASE/FILTER أبسط — فلا تحتاج إلى إضافة أو التعامل مع تعقيدات الوسيطتين. استخدم crosstab عندما:

  • يكون لديك عدد كبير من الفئات
  • تُحمّل الفئات بشكل ديناميكي
  • تنشئ بيانات لمستهلك تحويل محوري خارجي

التحويلات المحورية الديناميكية

بالنسبة إلى الفئات غير المعروفة وقت التشغيل، أنشئ SQL في تطبيقك أو استخدم PL/pgSQL مع format() + EXECUTE.

-- Build the SQL dynamically:
SELECT string_agg(format('SUM(CASE WHEN status = %L THEN 1 END) AS %I',
                          status, status), ', ')
FROM (SELECT DISTINCT status FROM orders) s;

إنشاء تنسيق عريض لجداول البيانات

غالباً ما تحتاج تقارير المحللين إلى تنسيق عريض. أنشئه في SQL، أو مرّر البيانات بالتنسيق الطولي ودع أداة BI تنفّذ التحويل المحوري.

Unpivot: العملية العكسية

للتحويل من التنسيق العريض → الطولي، استخدم UNION ALL أو jsonb_each_text() في PostgreSQL:

SELECT id, key AS month, (value)::NUMERIC AS revenue
FROM monthly_wide,
     jsonb_each_text(to_jsonb(monthly_wide) - 'id');

الأداء

تنفّذ crosstab() الاستعلام الداخلي مرة واحدة ثم تجري التحويل المحوري في الذاكرة. وتكون عنق الزجاجة هو نفسه الموجود في استعلام GROUP BY عادي.

قيود crosstab

لا توجد كلمة مفتاحية PIVOT أصلية في PostgreSQL، بخلاف Oracle وSQL Server. وتُعد crosstab() الحل البديل.

خلاصة

بالنسبة إلى معظم التحويلات المحورية، يكون CASE/FILTER هو الحل الواضح. أما crosstab() فهو أداتك عندما تكون الفئات كثيرة أو غير معروفة مسبقاً.

تحقق سريع

أي إضافة توفر دالة crosstab() في PostgreSQL؟

الأسئلة الشائعة

هل درس «أنماط Crosstab (PostgreSQL crosstab())» مجاني؟

نعم — نص درس «أنماط Crosstab (PostgreSQL crosstab())» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «أنماط Crosstab (PostgreSQL crosstab())»؟

أنشئ جداول Pivot حقيقية باستخدام الدالة crosstab() من إضافة tablefunc. تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «أنماط Crosstab (PostgreSQL crosstab())»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. UNION وINTERSECT وEXCEPT
  2. UNION ALL مقابل UNION (تكلفة إزالة التكرارات)
  3. تعبيرات CASE واستعلامات Pivot
  4. أنماط Crosstab (PostgreSQL crosstab())
← العودة إلى SQL Academy