1

La requête Oracle Oracle SQL en utilisant la fonction globale dans la sous-requête à SQL Server (T-SQL) estbesoin de convertir la requête

SELECT A.BUSINESS_UNIT 
    , A.EXT_ORG_ID 
    , A.INVOICE_ID 
    , A.CONTACT_NAME 
    , SUM(A.LINE_AMT) AS INVOICE_AMT 
    , SUM(CASE WHEN A.APPLIED_AMT - Nvl((SELECT SUM(LINE_AMT) FROM PS_ITEM_LINE_SF WHERE BUSINESS_UNIT = A.BUSINESS_UNIT AND COMMON_ID = A.EXT_ORG_ID AND ITEM_NBR = A.ITEM_NBR AND ITEM_TYPE_CD = A.ITEM_TYPE_CD 
              AND LINE_AMT*100000+LINE_SEQ_NBR>A.LINE_AMT*100000+A.LINE_SEQ_NBR),0) < 0 THEN A.LINE_AMT 
       WHEN A.APPLIED_AMT - Nvl((SELECT SUM(LINE_AMT) FROM PS_ITEM_LINE_SF WHERE BUSINESS_UNIT = A.BUSINESS_UNIT AND COMMON_ID = A.EXT_ORG_ID AND ITEM_NBR = A.ITEM_NBR AND ITEM_TYPE_CD = A.ITEM_TYPE_CD 
              AND LINE_AMT*100000+LINE_SEQ_NBR>A.LINE_AMT*100000+A.LINE_SEQ_NBR),0) >= A.LINE_AMT THEN 0 
       ELSE A.LINE_AMT - A.APPLIED_AMT+Nvl((SELECT SUM(LINE_AMT) FROM PS_ITEM_LINE_SF WHERE BUSINESS_UNIT = A.BUSINESS_UNIT AND COMMON_ID = A.EXT_ORG_ID AND ITEM_NBR = A.ITEM_NBR AND ITEM_TYPE_CD = 
                 A.ITEM_TYPE_CD AND LINE_AMT*100000+LINE_SEQ_NBR>A.LINE_AMT*100000+A.LINE_SEQ_NBR),0) END) AS INVOICE_BALANCE 
     , 0.0 FROM PS_SIS_SF_EO_INV_V A 
     GROUP BY A.BUSINESS_UNIT, A.EXT_ORG_ID, A.INVOICE_ID, A.CONTACT_NAME 

Conversion NVL à ISNULL a donné l'erreur suivante. "Impossible d'exécuter une fonction d'agrégation sur une expression contenant un agrégat ou une sous-requête." J'ai donc fait des recherches sur internet et j'ai trouvé que le CTE devait être appliqué.

J'ai converti la requête comme ci-dessous, mais le résultat de la requête n'est toujours pas le même que la requête Oracle. S'il vous plaît aider.

WITH CTELINE AS (SELECT SUM(B.LINE_AMT) AS LINE_AMT, A.BUSINESS_UNIT FROM PS_ITEM_LINE_SF B, PS_SIS_SF_EO_INV_V A 
       WHERE B.BUSINESS_UNIT = A.BUSINESS_UNIT AND B.COMMON_ID = A.EXT_ORG_ID AND B.ITEM_NBR = A.ITEM_NBR AND B.ITEM_TYPE_CD = A.ITEM_TYPE_CD  
       AND B.LINE_AMT*100000 + B.LINE_SEQ_NBR > A.LINE_AMT * 100000 + A.LINE_SEQ_NBR GROUP BY A.BUSINESS_UNIT 
       ), 
    CTECASE AS (SELECT CASE WHEN C.APPLIED_AMT - ISNULL((SELECT LINE_AMT FROM CTELINE ),0) < 0 THEN C.LINE_AMT 
          WHEN C.APPLIED_AMT - ISNULL((SELECT LINE_AMT FROM CTELINE),0) > = C.LINE_AMT THEN 0 
          ELSE C.LINE_AMT - C.APPLIED_AMT+ISNULL(( SELECT LINE_AMT FROM CTELINE),0)  END AS CTE_INVOICE_BALANCE 
         ,C.BUSINESS_UNIT,C.EXT_ORG_ID, C.INVOICE_ID FROM PS_SIS_SF_EO_INV_V C, CTELINE CTEL WHERE CTEL.BUSINESS_UNIT = C.BUSINESS_UNIT 
         GROUP BY C.BUSINESS_UNIT, C.EXT_ORG_ID, C.INVOICE_ID, C.CONTACT_NAME,C.APPLIED_AMT,C.LINE_AMT 
       ) 
SELECT A.BUSINESS_UNIT 
, A.EXT_ORG_ID 
, A.INVOICE_ID 
, A.CONTACT_NAME 
, SUM(A.LINE_AMT) AS INVOICE_AMT 
, SUM(CTE_INVOICE_BALANCE) AS INVOICE_BALANCE 
, 0.0 
    FROM PS_SIS_SF_EO_INV_V A, CTECASE CTEC WHERE CTEC.BUSINESS_UNIT = A.BUSINESS_UNIT AND A.EXT_ORG_ID = CTEC.EXT_ORG_ID AND 
    A.INVOICE_ID = CTEC.INVOICE_ID 
    GROUP BY A.BUSINESS_UNIT, A.EXT_ORG_ID, A.INVOICE_ID, A.CONTACT_NAME 
+0

Sur une note: Les clauses WITH peuvent rendre une requête plus lisible, mais les jointures antérieures à 1992 ne le sont certainement pas. Pourquoi ne pas vous joindre à des jointures ANSI appropriées? –

Répondre

0

Vous avez eu raison de réécrire la requête initiale. Il a été écrit beaucoup trop compliqué contenant trois sous-requêtes identiques. Voici mon avis sur la requête:

select 
    business_unit, 
    ext_org_id, 
    invoice_id, 
    contact_name, 
    sum(line_amt) as invoice_amt, 
    sum 
    (
    case 
     when applied_amt < sum_line_amt then line_amt 
     when applied_amt >= sum_line_amt + line_amt then 0 
     else line_amt - applied_amt + sum_line_amt 
    end 
) as invoice_balance, 
    0.0 
from 
(
    select 
    a.*, 
    coalesce 
    (
     ( 
     select sum(il.line_amt) 
     from ps_item_line_sf il 
     where il.business_unit = a.business_unit 
     and il.common_id = a.ext_org_id 
     and il.item_nbr = a.item_nbr 
     and il.item_type_cd = a.item_type_cd 
     and il.line_amt * 100000 + il.line_seq_nbr > a.line_amt * 100000 + a.line_seq_nbr 
    ), 0 
    ) as sum_line_amt 
    from ps_sis_sf_eo_inv_v a 
) mydata 
group by business_unit, ext_org_id, invoice_id, contact_name; 

j'ai gardé l'alias de table d'origine A, bien que je ne l'aime pas pour ne pas être mnémotechnique. Mais je ne sais pas quelle partie (s) du nom ps_sis_sf_eo_inv_v devrait être prise pour le nom d'alias, bien sûr.

Si je n'ai fait aucune erreur, alors cette requête devrait faire exactement la même chose que l'original et être facile à convertir.

+0

merci pour l'aide, il a travaillé. –

+0

@PrinceKumar vous devriez accepter la réponse – PreQL