سؤال

أحاول أن أفعل معقدة إلى حد ما SELECT الحساب الذي سأعمم:

  1. الاستعلام الرئيسي هو SELECE WINDCARD للحصول على جدول
  2. فرعي واحد يفعل COUNT() من جميع البنود بناء على حالة (هذا يعمل بشكل جيد)
  3. عمل استقبال آخر يفعل SUM() من الأرقام في عمود بناء على شرط آخر. هذا يعمل أيضا بشكل صحيح، إلا عندما لا تفي أي سجلات بالشروط، فإنها تعود NULL.

أردت في البداية أن أضيف الفرعيين، شيء من هذا القبيل (subquery1)+(subquery2) AS total الذي يعمل بشكل جيد ما لم يكن Subquery2 فارغ، وفي هذه الحالة total يصبح لاغيا، بغض النظر عن ما هي نتيجة Subquery1. كان فكري الثاني هو محاولة إنشاء عمود ثالث هو حساب التلقائيين (أي، (subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total) لكنني لا أعتقد أنه من الممكن حساب عمودين محسوبين، وحتى لو كان ذلك، أشعر أن نفس المشكلة تنطبق.

هل لدى أي شخص حل أنيق لهذه المشكلة خارج مجرد الحصول على القيم الفرعية المستقاة وإجماليها في برنامجي؟

شكرا!

هل كانت مفيدة؟

المحلول

مسألتين مستمران هنا:

  • لا يمكنك استخدام اسم مستعار عمود واحد في تعبير آخر في قائمة تحديد نفس القائمة.

    ومع ذلك، يمكنك إنشاء الأسماء المستعارة في Sacquery Table مشتقة واستخدامها في استعلام خارجي.

  • لا يمكنك أن تفعل حسابي مع فارغة null ليس صفر.

    ومع ذلك، يمكنك "الافتراضي" NULL إلى قيمة غير فارغة باستخدام COALESCE() وظيفة. ترجع هذه الوظيفة أول حجة غير فارغة.

إليك مثال:

SELECT *, count1+count2 AS total
FROM (SELECT *, COALESCE((subquery1), 0) AS count1, 
                COALESCE((subquery2), 0) AS count2 
      FROM ... ) t;

(تذكر أن جدول مشتق يجب إعطاء اسم مستعار الجدول "T" في هذا المثال)

نصائح أخرى

أولا، يجب أن تساعدك وظيفة Coalesce على العناية بأي مشاكل فارغة.

هل يمكنك استخدام اتحاد لدمج هذين الاستعلامات في مجموعة نتيجة واحدة، ثم تعامله كإجراء استعداء لمزيد من التحليل؟

أو ربما لم أفهم تماما سؤالك؟

سأحاول (للاستعلام الثاني) شيء مثل: حدد Summ (ISNULL (MyColumn، 0)) // يرجى التحقق من بناء الجملة على ذلك قبل استخدامه، على الرغم من ...

هذا يجب أن يعود 0 بدلا من null لأي مثيل من هذا العمود يجري صفر.

قد يكون من الضروري القول، ولكن نظرا لأنك تستخدمه داخل برنامج، فما تفضل استخدام منطق البرنامج لتلخيص النتائجتين (NULL ورقم)، بسبب مشكلات قابلية إمكانية التشغيل.

من يدري عندما يتم إهمال وظيفة Coalesce أو إذا كانت DBMS أخرى تدعمها أم لا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top