سؤال

الرمز التالي يعمل بدون مشاكل:

select donem, mekankodu, count(yayin_kodu) yc, 
       SUM(CASE WHEN iade =0 THEN 1 ELSE 0 END) yys
from 
(    select donem,
            bayi_adi,
            bayi_kodu,
            x.mekankodu,
            mekan_adi,
            mekan_tipi,
            yayin_kodu,
            yayin_adi,
            sum(x.b2b_dagitim + x.b2b_transfer) sevk,
            sum(x.b2b_iade) iade,
            sum(x.b2b_dagitim + x.b2b_transfer - x.b2b_iade) satis
    from mps_view2 x
    where x.donem = '200910'
    and x.yayin_kodu in (93,95,98,99,103,174,307,309,311,489,491,495,533,534,538,605,641,642,650,2539,
                         2697,4560,5049,5772,5950,5980,7318,7440,8086,8524,11161,12707,12708,12709,14376,
                         15107,15309,15633)
    and x.mekankodu in (31851,38569,7123,7403,7481)
    group by donem, bayi_adi, bayi_kodu, mekankodu, mekan_adi, mekan_tipi, yayin_kodu, yayin_adi
    order by donem, bayi_kodu, mekan_adi, yayin_adi
)
group by donem, mekankodu

عندما أرغب في تضمين yc/yss في جدول النتيجة الخاص بي ، أرتب SELECT جزء كما يلي:

select donem, mekankodu, count(yayin_kodu) yc, 
       SUM(CASE WHEN iade =0 THEN 1 ELSE 0 END) yys,
       yc/yys yo

لكنه يعطي

ORA-00904 خطأ: YYS: معرف غير صالح.

ماذا علي أن أفعل؟

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

المحلول

استخدم A مع بيان:

with subquery_name as
(
    select
       donem,
       mekankodu,
       count(yayin_kodu) as yc, 
       SUM(CASE WHEN iade =0 THEN 1 ELSE 0 END) as yys
    from
        ...
)
select
    donem,
    mekankodu,
    yc,
    yys,
    yc/yys as yo
from
    subquery_name

هذه ميزة مفيدة للغاية من PL/SQL. أنت تحاول الوصول إلى عمود تم إنشاؤه في نفس الاستعلام ، وهو أمر غير ممكن. سيسمح لك A مع بيان بحساب عمود جديد استنادًا إلى عمود محسوب آخر كما تفعل هنا.

نصائح أخرى

لا يمكنك الرجوع إلى الأعمدة الأخرى في نفس SELECT. استخدم الاختيار الفرعي:

select donem, mekankodu, yc, yys, yc/yys yo
from
(
    select donem, mekankodu, count(yayin_kodu) yc,
        SUM(CASE WHEN iade =0 THEN 1 ELSE 0 END) yys,
        yc/yys yo
    from ...
) Sub

لا يمكنك الوصول إلى عمود تم إنشاؤه جارًا في SQL ، ومع ذلك يمكنك الوصول إلى دليل البيانات:

select donem, mekankodu, count(yayin_kodu) yc, 
       SUM(CASE WHEN iade =0 THEN 1 ELSE 0 END) yys,
       count(yayin_kodu)/SUM(CASE WHEN iade =0 THEN 1 ELSE 0 END) "yc/yys"
from 
(    select donem,
            bayi_adi,
            bayi_kodu,
            x.mekankodu,
            mekan_adi,
            mekan_tipi,
            yayin_kodu,
            yayin_adi,
            sum(x.b2b_dagitim + x.b2b_transfer) sevk,
            sum(x.b2b_iade) iade,
            sum(x.b2b_dagitim + x.b2b_transfer - x.b2b_iade) satis
    from mps_view2 x
    where x.donem = '200910'
    and x.yayin_kodu in (93,95,98,99,103,174,307,309,311,489,491,495,533,534,538,605,641,642,650,2539,
                         2697,4560,5049,5772,5950,5980,7318,7440,8086,8524,11161,12707,12708,12709,14376,
                         15107,15309,15633)
    and x.mekankodu in (31851,38569,7123,7403,7481)
    group by donem, bayi_adi, bayi_kodu, mekankodu, mekan_adi, mekan_tipi, yayin_kodu, yayin_adi
    order by donem, bayi_kodu, mekan_adi, yayin_adi
)
group by donem, mekankodu

ملاحظة: هذا ليس غير فعال كما يبدو ... SQL ذكي بما يكفي للقيام بالحساب مرة واحدة واستخدام النتيجة مرتين في معظم الحالات. في أكثر الأحيان ، ثق بالمحسن.

هل نسيت "كما"؟

select donem, mekankodu, count(yayin_kodu) yc, 
   SUM(CASE WHEN iade =0 THEN 1 ELSE 0 END) AS yys 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top