Colocar subquery no group by

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
  

Mensagemem Qua, 19 Fev 2020 6:22 pm

Como eu faço um group by dessa query? Veja que tenho um SUM e logo em seguida um campo criado por uma subquery

Código: Selecionar todos
SELECT    0,
                SYSDATE,
                SUM(AXG2000.Cob_Leasing(CTR_COD_NUM,CTR_COD_EXT,CTR_PERFIL_NUM,SYSDATE,'P')) AS VALOR,
                SUBSTR(TO_CHAR((SELECT    MAX(SUBSTR(TO_CHAR(T2.CTR_PERFIL_NUM,'00'),2,2))
                                FROM TAB_CTR_PERFIL T2
                                WHERE T2.PAR_EMP_COD               = T1.PAR_EMP_COD
                                AND   T2.PAR_PRD_COD               = T1.PAR_PRD_COD
                                AND   T2.CTR_COD_NUM               = T1.CTR_COD_NUM
                                AND   T2.CTR_COD_EXT               = T1.CTR_COD_EXT),'00'),2,2)   AS PRAZO
        FROM TAB_CTR_PERFIL T1
        WHERE PAR_EMP_COD               = 2
        AND   PAR_PRD_COD               = 11
        AND   CTR_COD_NUM               = LPAD(SUBSTR(920916,1,LENGTH(920916)-1),18,'0')
        AND   CTR_COD_EXT               = AXG2000.FN_COB_LEA_TRAZ_EXTENSAO(' ')
        AND   CTR_PERFIL_NUM             >0
        AND   CTR_PERFIL_NUM             <99
        AND   CTR_PERFIL_TP_VRG        NOT IN ('A','F')
        AND   AXG2000.Cob_Leasing(CTR_COD_NUM,CTR_COD_EXT,CTR_PERFIL_NUM,SYSDATE,'P') > ((CTR_PERFIL_VALOR_PRCL_ATUAL+CTR_PERFIL_VALOR_VRG_ATUAL)*0.70)
        AND  (CTR_PERFIL_STA_SISTEMA  = 'S'
        AND      CTR_PERFIL_DT_VENC       <   (SELECT    MAX(CTR_BAIXAS_DT_PAGTO) FROM TAB_CTR_BAIXAS  T2
                                           WHERE T2.CTR_BAIXAS_DT_PAGTO = (SELECT MAX(T5.CTR_BAIXAS_DT_PAGTO)
                                                                                 FROM TAB_CTR_BAIXAS T5
                                                                           WHERE T5.PAR_EMP_COD = T2.PAR_EMP_COD
                                                                           AND T5.PAR_PRD_COD = T2.PAR_PRD_COD
                                                                           AND T5.CTR_COD_NUM = T2.CTR_COD_NUM
                                                                           AND T5.CTR_COD_EXT = T2.CTR_COD_EXT
                                                                           AND T5.CTR_PERFIL_NUM = T2.CTR_PERFIL_NUM)
                                           AND     T2.PAR_EMP_COD                  = T1.PAR_EMP_COD
                                           AND       T2.PAR_PRD_COD                  = T1.PAR_PRD_COD
                                           AND       T2.CTR_COD_NUM                  = T1.CTR_COD_NUM
                                           AND       T2.CTR_COD_EXT                  = T1.CTR_COD_EXT
                                           AND       T2.CTR_PERFIL_NUM               = T1.CTR_PERFIL_NUM
                                           AND       T2.CTR_BAIXAS_DT_ESTORNO        IS NULL
                                           AND    (T2.CTR_BAIXAS_DEVIDO_VAL_PRCL   <> 0 OR
                                                   T2.CTR_BAIXAS_DEVIDO_VAL_VRG    <> 0 OR
                                                   T2.CTR_BAIXAS_DEVIDO_VAL_MULTA  <> 0 OR
                                                   T2.CTR_BAIXAS_DEVIDO_VAL_CP_DIA <> 0))
        AND (SELECT    SUM(T3.CTR_BAIXAS_VALOR_RESID_ABSORV)
             FROM  TAB_CTR_BAIXAS  T3
             WHERE T3.PAR_EMP_COD          = T1.PAR_EMP_COD
             AND   T3.PAR_PRD_COD          = T1.PAR_PRD_COD
             AND   T3.CTR_COD_NUM          = T1.CTR_COD_NUM
             AND   T3.CTR_COD_EXT          = T1.CTR_COD_EXT
             AND   T3.CTR_PERFIL_NUM       = T1.CTR_PERFIL_NUM
             AND   T3.CTR_BAIXAS_DT_PAGTO  = (SELECT    MAX(T4.CTR_BAIXAS_DT_PAGTO)
                                              FROM TAB_CTR_BAIXAS  T4
                                              WHERE     T4.PAR_EMP_COD    = T3.PAR_EMP_COD
                                              AND       T4.PAR_PRD_COD    = T3.PAR_PRD_COD
                                              AND       T4.CTR_COD_NUM    = T3.CTR_COD_NUM
                                              AND       T4.CTR_COD_EXT    = T3.CTR_COD_EXT
                                              AND       T4.CTR_PERFIL_NUM = T3.CTR_PERFIL_NUM)
             AND   T3.CTR_BAIXAS_NUM       = (SELECT    MAX(T5.CTR_BAIXAS_NUM)
                                              FROM TAB_CTR_BAIXAS  T5
                                              WHERE     T5.PAR_EMP_COD    = T3.PAR_EMP_COD
                                              AND       T5.PAR_PRD_COD    = T3.PAR_PRD_COD
                                              AND       T5.CTR_COD_NUM    = T3.CTR_COD_NUM
                                              AND       T5.CTR_COD_EXT    = T3.CTR_COD_EXT
                                              AND       T5.CTR_PERFIL_NUM = T3.CTR_PERFIL_NUM)) = 0
        OR   CTR_PERFIL_STA_SISTEMA = 'N'
        AND  CTR_PERFIL_DT_VENC      <= TO_DATE(SYSDATE - 5))
        AND  EXISTS (SELECT *
                          FROM TAKS076T_PREST_ACORDO_REACT PRES,
                               TAKS063T_ACORDO             ACOR
                          WHERE PRES.PKND_CONTRATO   = 920916
                          AND   PRES.PKND_PRODUTO    = 7
                          AND   PRES.PKND_PRESTACAO  = CTR_PERFIL_NUM
                          AND   ACOR.PKND_ACORDO     = PRES.PKND_ACORDO
                          AND   ACOR.ATDT_CANCEL     IS NULL
                          AND   ACOR.FL_BX_NEGATIVACAO = 'S')
        AND          NOT EXISTS (SELECT REFI.FKND_CONTRATO
                           FROM  TAKS900T_REFIN          REFI
                           WHERE  REFI.FKND_CONTRATO   = 920916
                           --AND    REFI.FKSV_SERIE      = V_FKSV_SERIE
                           AND    REFI.FKND_EMPRESA    = 4
                           AND    REFI.FKND_PRODUTO    = 2
                           AND    REFI.ATSV_STPAGTO    = 'N'
                           AND    REFI.ATDT_ENVIO      >= TO_DATE('01/02/2020','DD/MM/YYYY'))
                           --AND    REFI.FKND_PARCELA    = CTR_PERFIL_NUM
pnet2020

Mensagemem Qui, 20 Fev 2020 1:51 pm

Uma forma de fazer isso é primeiro buscar toda informação que você precisa em uma sub-query e só no final fazer os SUM e GROUP BY.

Por exemplo:
Código: Selecionar todos
select nnnnnn
,                 SUM(AXG2000.Cob_Leasing(CTR_COD_NUM,CTR_COD_EXT,CTR_PERFIL_NUM,SYSDATE,'P')) AS VALOR,
from (
SELECT    0,
                SYSDATE,
                CTR_COD_NUM,CTR_COD_EXT,CTR_PERFIL_NUM,
                SUBSTR(TO_CHAR((SELECT    MAX(SUBSTR(TO_CHAR(T2.CTR_PERFIL_NUM,'00'),2,2))
                                FROM TAB_CTR_PERFIL T2
                                WHERE T2.PAR_EMP_COD               = T1.PAR_EMP_COD
                                AND   T2.PAR_PRD_COD               = T1.PAR_PRD_COD
                                AND   T2.CTR_COD_NUM               = T1.CTR_COD_NUM
                                AND   T2.CTR_COD_EXT               = T1.CTR_COD_EXT),'00'),2,2)   AS PRAZO
        FROM TAB_CTR_PERFIL T1
        WHERE PAR_EMP_COD               = 2
        AND   PAR_PRD_COD               = 11
        AND   CTR_COD_NUM               = LPAD(SUBSTR(920916,1,LENGTH(920916)-1),18,'0')
        AND   CTR_COD_EXT               = AXG2000.FN_COB_LEA_TRAZ_EXTENSAO(' ')
        AND   CTR_PERFIL_NUM             >0
        AND   CTR_PERFIL_NUM             <99
        AND   CTR_PERFIL_TP_VRG        NOT IN ('A','F')
        AND   AXG2000.Cob_Leasing(CTR_COD_NUM,CTR_COD_EXT,CTR_PERFIL_NUM,SYSDATE,'P') > ((CTR_PERFIL_VALOR_PRCL_ATUAL+CTR_PERFIL_VALOR_VRG_ATUAL)*0.70)
        AND  (CTR_PERFIL_STA_SISTEMA  = 'S'
        AND      CTR_PERFIL_DT_VENC       <   (SELECT    MAX(CTR_BAIXAS_DT_PAGTO) FROM TAB_CTR_BAIXAS  T2
                                           WHERE T2.CTR_BAIXAS_DT_PAGTO = (SELECT MAX(T5.CTR_BAIXAS_DT_PAGTO)
                                                                                 FROM TAB_CTR_BAIXAS T5
                                                                           WHERE T5.PAR_EMP_COD = T2.PAR_EMP_COD
                                                                           AND T5.PAR_PRD_COD = T2.PAR_PRD_COD
                                                                           AND T5.CTR_COD_NUM = T2.CTR_COD_NUM
                                                                           AND T5.CTR_COD_EXT = T2.CTR_COD_EXT
                                                                           AND T5.CTR_PERFIL_NUM = T2.CTR_PERFIL_NUM)
                                           AND     T2.PAR_EMP_COD                  = T1.PAR_EMP_COD
                                           AND       T2.PAR_PRD_COD                  = T1.PAR_PRD_COD
                                           AND       T2.CTR_COD_NUM                  = T1.CTR_COD_NUM
                                           AND       T2.CTR_COD_EXT                  = T1.CTR_COD_EXT
                                           AND       T2.CTR_PERFIL_NUM               = T1.CTR_PERFIL_NUM
                                           AND       T2.CTR_BAIXAS_DT_ESTORNO        IS NULL
                                           AND    (T2.CTR_BAIXAS_DEVIDO_VAL_PRCL   <> 0 OR
                                                   T2.CTR_BAIXAS_DEVIDO_VAL_VRG    <> 0 OR
                                                   T2.CTR_BAIXAS_DEVIDO_VAL_MULTA  <> 0 OR
                                                   T2.CTR_BAIXAS_DEVIDO_VAL_CP_DIA <> 0))
        AND (SELECT    SUM(T3.CTR_BAIXAS_VALOR_RESID_ABSORV)
             FROM  TAB_CTR_BAIXAS  T3
             WHERE T3.PAR_EMP_COD          = T1.PAR_EMP_COD
             AND   T3.PAR_PRD_COD          = T1.PAR_PRD_COD
             AND   T3.CTR_COD_NUM          = T1.CTR_COD_NUM
             AND   T3.CTR_COD_EXT          = T1.CTR_COD_EXT
             AND   T3.CTR_PERFIL_NUM       = T1.CTR_PERFIL_NUM
             AND   T3.CTR_BAIXAS_DT_PAGTO  = (SELECT    MAX(T4.CTR_BAIXAS_DT_PAGTO)
                                              FROM TAB_CTR_BAIXAS  T4
                                              WHERE     T4.PAR_EMP_COD    = T3.PAR_EMP_COD
                                              AND       T4.PAR_PRD_COD    = T3.PAR_PRD_COD
                                              AND       T4.CTR_COD_NUM    = T3.CTR_COD_NUM
                                              AND       T4.CTR_COD_EXT    = T3.CTR_COD_EXT
                                              AND       T4.CTR_PERFIL_NUM = T3.CTR_PERFIL_NUM)
             AND   T3.CTR_BAIXAS_NUM       = (SELECT    MAX(T5.CTR_BAIXAS_NUM)
                                              FROM TAB_CTR_BAIXAS  T5
                                              WHERE     T5.PAR_EMP_COD    = T3.PAR_EMP_COD
                                              AND       T5.PAR_PRD_COD    = T3.PAR_PRD_COD
                                              AND       T5.CTR_COD_NUM    = T3.CTR_COD_NUM
                                              AND       T5.CTR_COD_EXT    = T3.CTR_COD_EXT
                                              AND       T5.CTR_PERFIL_NUM = T3.CTR_PERFIL_NUM)) = 0
        OR   CTR_PERFIL_STA_SISTEMA = 'N'
        AND  CTR_PERFIL_DT_VENC      <= TO_DATE(SYSDATE - 5))
        AND  EXISTS (SELECT *
                          FROM TAKS076T_PREST_ACORDO_REACT PRES,
                               TAKS063T_ACORDO             ACOR
                          WHERE PRES.PKND_CONTRATO   = 920916
                          AND   PRES.PKND_PRODUTO    = 7
                          AND   PRES.PKND_PRESTACAO  = CTR_PERFIL_NUM
                          AND   ACOR.PKND_ACORDO     = PRES.PKND_ACORDO
                          AND   ACOR.ATDT_CANCEL     IS NULL
                          AND   ACOR.FL_BX_NEGATIVACAO = 'S')
        AND          NOT EXISTS (SELECT REFI.FKND_CONTRATO
                           FROM  TAKS900T_REFIN          REFI
                           WHERE  REFI.FKND_CONTRATO   = 920916
                           --AND    REFI.FKSV_SERIE      = V_FKSV_SERIE
                           AND    REFI.FKND_EMPRESA    = 4
                           AND    REFI.FKND_PRODUTO    = 2
                           AND    REFI.ATSV_STPAGTO    = 'N'
                           AND    REFI.ATDT_ENVIO      >= TO_DATE('01/02/2020','DD/MM/YYYY'))
                           --AND    REFI.FKND_PARCELA    = CTR_PERFIL_NUM

)
group by nnnnnnn
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Sex, 21 Fev 2020 3:39 pm

dr_gori, nessa abordagem só trás o VALOR. Demais campos não aparece.
pnet2020

Mensagemem Sex, 21 Fev 2020 4:38 pm

Quando eu coloquei select nnnnnn significa que é pra colocar em "nnnnn" todos os campos que você quer.
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered

Mensagemem Qua, 04 Mar 2020 4:09 pm

Voltei ao problema, pois não funcionou. O campo Prazo eu deveria colocar e é a subquery e se eu colocarno lugar do nnnnnnn caio nomesmo problema do Group By.
pnet2020

Mensagemem Qua, 04 Mar 2020 4:39 pm

dr_gori, resolveu sim e muito obrigado. Eu é que estava enganado. Tem como marcar a sua resposta, como solução do meu problema?
pnet2020

Mensagemem Qua, 04 Mar 2020 7:49 pm

Infelizmente não tem como marcar. Mas que bom que deu certo.
dr_gori
Localização: Portland, OR USA

Thomas F. G

Você já respondeu a dúvida de alguém hoje?
http://glufke.net/oracle/search.php?search_id=unanswered



Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Bing [Bot], Google Adsense [Bot] e 7 visitantes