استخدام وظيفة IndexCol

في Oracle Analytics، غالبًا ما يتم استخدام جمل CASE عندما تتفرع العملية الحسابية تبعًا لقيمة المتغير. عند الإشارة إلى متغير في جملة CASE، من الأفضل استخدام وظيفة IndexCol بدلاً من تحسين كفاءة تعليمة SQL البرمجية التي تم تكوينها. يصف هذا الموضوع وظيفة IndexCol ومكان استخدامها.

حول وظيفة IndexCol

تستخدم وظيفة IndexCol عندما تختلف الأعمدة أو القيم في حساب تبعًا لقيمة الجلسة أو المستودع أو متغير التقديم.

صياغة وظيفة IndexCol هي:

INDEXCOL(<<integer_literal>>, <<expr_list>>)

عندما يتم حل الوسيطة الأولى إلى عدد صحيح والعناصر التي تشكل <<expr_list>> تطابق عدد القيم المحتملة للوسيطة الأولى. يتم استخدام واحد من هذه العناصر في جملة SQL تبعًا لقيمة الوسيطة الأولى.

على سبيل المثال، إذا كانت وسيطة <<integer_literal>> بثلاث قيم محتملة، يجب وجود ثلاث وسيطات في وسيطة <<expr_list>> ، واحدة لكل قيمة محتملة <<integer_literal>>.

غالبًا ما تعتمد الوسيطة الأولى على قيمة متغير الجلسة أو جملة CASE فيما يتعلق بالمتغيرات. يمكنك نمذجة وظيفة IndexCol في ملف المستودع (RPD) أو مباشرة في عمود تقرير. يمكن تداخل عدة وظائف IndexCol functions لتكوين جملة واحدة.

مزايا وظيفة IndexCol

يتم دفع حساب يستخدم جملة <<case when>> إلى تعليمة SQL البرمجية الفعلية بالكامل. بالمقارنة، لا تدفع وظيفة IndexCol إلا التعبير أو العمود اللازم لقاعدة البيانات. هذا لأن وظيفة IndexCol يتم تقييمها قبل تكوين تعليمة SQL البرمجية الفعلية.

عند الجمع مع مطالبات المتغير، التي تتيح التحديد في قائمة القيم، يمكنك تعديل هيكل التقرير بشكل كبير بدون أي زيادة تكلفة في الأداء.

أحد عيوب وظيفة IndexCol هي أنه لا يمكنك استخدامها مع like في حسابات الأعداد الصحيحة، بالرغم من أنه يمكنك استخدام like في قائمة التعبيرات. إذا كان حساب العدد الصحيح يتطلب like، فعليك استخدام جملة CASE بدلاً من ذلك.

مثال

لنفترض وجود متغير جلسة بالاسم PREFERRED_CURRENCY يقوم بتعيين العملة المفضلة للمستخدم. ثم، تبعًا لقيمة متغير الجلسة، يتم عرض الإيرادات بالعملة المحددة بواسطة المستخدم.

تم تكوين عمليتين حسابيتين لإرجاع العملة الصحيحة بناءً على قيمة متغير الجلسة.

تستخدم الأولى جملة CASE، كما في هذا المثال:

CASE

WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'USD' THEN "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Usd" 

WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'EUR' THEN  "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Eur" 

WHEN VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY") = 'AUD' THEN  "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Aud" 

ELSE NULL

END

وتستخدم الثانية وظيفة IndexCol، كما في هذا المثال:

INDEXCOL(

CASE VALUEOF("NQ_SESSION"."PREFERRED_CURRENCY")

WHEN 'USD' THEN 0

WHEN 'EUR' THEN 1

WHEN 'AUD' THEN 2

END ,

"01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Usd", "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Eur", "01 - Sample App Data (ORCL)".""."BISAMPLE"."F19 Rev. (Converted)"."Revenue_Aud")

لأنه يجب حل الوسيطة الأولى لوظيفة IndexCol لعدد صحيح، يتم استخدام جملة CASE لهذا الحل.

عند تشغيل استعلام باستخدام حساب جملة CASE، يتم دفع كل جملة CASE إلى قاعدة البيانات لأنه يتم تقييم جملة CASE عند وقت التشغيل. في بعض الحالات، يتسبب هذا في مشكلات مع المحسن.

WITH

SAWITH0 AS (select sum(case  when 'USD' = 'USD' then T42437.Revenue_Usd when 'EUR' = 'USD' then T42437.Revenue_Eur when 'AUD' = 'USD' then T42437.Revenue_Aud else NULL end ) as c1,

     T42412.Office_Dsc as c2,

     T42412.Office_Key as c3

from

     BISAMPLE.SAMP_OFFICES_D T42412 /* D30 Offices */ ,

     BISAMPLE.SAMP_REVENUE_CURR_F T42437 /* F19 Rev. (Converted) */

where  ( T42412.Office_Key = T42437.Office_Key )

group by T42412.Office_Dsc, T42412.Office_Key),

SAWITH1 AS (select 0 as c1,

     D1.c2 as c2,

     D1.c1 as c3,

     D1.c3 as c4

from

     SAWITH0 D1)

select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from ( select D1.c1 as c1,

     D1.c2 as c2,

     D1.c3 as c3

from

     SAWITH1 D1

order by c2 ) D1

The same query run using the IndexCol function pushes down only the expression needed to satisfy the query, because the IndexCol function is resolved prior to SQL generation.  This helps avoid issues with the Optimizer.

WITH

SAWITH0 AS (select sum(T42437.Revenue_Usd) as c1,

     T42412.Office_Dsc as c2,

     T42412.Office_Key as c3

from

     BISAMPLE.SAMP_OFFICES_D T42412 /* D30 Offices */ ,

     BISAMPLE.SAMP_REVENUE_CURR_F T42437 /* F19 Rev. (Converted) */

where  ( T42412.Office_Key = T42437.Office_Key )

group by T42412.Office_Dsc, T42412.Office_Key),

SAWITH1 AS (select 0 as c1,

     D1.c2 as c2,

     D1.c1 as c3,

     D1.c3 as c4

from

     SAWITH0 D1)

select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3 from ( select D1.c1 as c1,

     D1.c2 as c2,

     D1.c3 as c3

from

     SAWITH1 D1

order by c2 ) D1

المصنفات وIndexCol

يمكنك استخدام وظيفة IndexCol في المصنفات.

في هذا المثال، يتم استخدام وظيفة IndexCol لتغيير دقة الفترة في تمثيل مرئي:

  1. قم بتكوين معلمة يتم استخدامها كمحدد عمود لتحديد دقة الفترة، في هذه الحالة، الشهر أو ربع السنة.

    فيما يلي وصف GUID-1141C5E4-DB56-49D1-94EB-3010D274C477-default.jpg
    .jpg

  2. قم بتكوين حساب مخصص لتنفيذ وظيفة IndexCol. فيما يلي الحساب:
    indexcol(case when @parameter("Time Selector Value")('Month')='Month' then 0 else 1 end, "HCM - Workforce Core"."Time"."Month Name", "HCM - Workforce Core"."Time"."Quarter")

    فيما يلي وصف GUID-1EBB2C95-3D23-48C6-9754-EF968AFAFE98-default.jpg
    .jpg

  3. أضف المعلمة إلى شريط مرشحات مصنف. يمكن للمستخدمين تغيير دقة التقرير بتحديد الشهر أو ربع السنة من مرشح محدد العمود.

    فيما يلي وصف GUID-C1469E54-1C7D-4FDF-B3E6-CCFE73BF2A32-default.jpg
    .jpg