- Este tópico contém 8 respostas, 2 vozes e foi atualizado pela última vez 3 anos, 1 mês atrás por Eliza.
-
AutorPosts
-
17 de novembro de 2021 às 9:40 am #151964ElizaParticipante
olá pessoal,
Tive que incluir um campo novo no SELECT, depois disso acusa erro de ORA-00904
linha incluída:
, NVL((SELECT C1.PERCCOM PERCCOMI FROM AD_COMECOMMERCE C1 WHERE C1.DTAVIGENCIA = (SELECT max(C1.DTAVIGENCIA) AS DTAVIGENCIA FROM AD_COMECOMMERCE C1 WHERE C1.DTAVIGENCIA <= CAB.DTNEG AND C1.CODEMP = CAB.CODEMP) AND C1.CODEMP = CAB.CODEMP) ,0) AS PERCPLAT
=>select SEM erro
SELECT ….
, NVL(VEN.COMVENDA, 0) AS PERCCOMDEV
, VEN.AD_BASECALCCOM AS BCCOM
, EMP.AD_COMPLAT AS PERCPLAT =====> OK
, EMP.AD_COMECOMARG COMECOMARG
, TPO.AD_OPERADOR
, TPO.AD_LUCRATIVIDADE
, NULL AS LOCAL
, CAB.AD_ANOMES
, CAB.AD_ANO
, 0 AS VLRARMAZ
, 0 AS TOTVLRARMAZ
, 0 AS NUNOTACPA
, 0 AS CODEMPCPA
, 0 AS VLRCPA
, NULL AS DTENTSAICPA
, NULL AS COMPRADOR
FROM TGFCAB CAB INNER JOIN TGFPAR PAR ON PAR.CODPARC = CAB.CODPARC
INNER JOIN TSICID CID ON CID.CODCID = PAR.CODCID
INNER JOIN TSIUFS UFS ON UFS.CODUF = CID.UF
INNER JOIN TGFTOP TPO ON TPO.CODTIPOPER = CAB.CODTIPOPER AND TPO.DHALTER = CAB.DHTIPOPER
INNER JOIN TGFITE ITE ON ITE.NUNOTA = CAB.NUNOTA
INNER JOIN TGFEMP EMP ON EMP.CODEMP = CAB.CODEMP
INNER JOIN TGFPRO PRO ON PRO.CODPROD = ITE.CODPROD
LEFT JOIN TGFMAR MAR ON MAR.CODIGO = PRO.CODMARCA
LEFT JOIN TGFPAR FRN ON FRN.CODPARC = PRO.CODPARCFORN
INNER JOIN TGFGRU GRU ON GRU.CODGRUPOPROD = PRO.CODGRUPOPROD
LEFT JOIN TGFVEN VEN ON VEN.CODVEND = CAB.CODVEND
LEFT JOIN TCP_IMPOSTOS IMP ON IMP.NUNOTA = ITE.NUNOTA AND IMP.SEQUENCIA = ITE.SEQUENCIA
LEFT JOIN AD_LINPROD LIN ON GRU.AD_CODLINPROD = LIN.CODLIN
WHERE TPO.GOLDEV = -1GROUP BY CAB.CODEMP, EMP.AD_COMPLAT, EMP.AD_COMECOMARG, NVL(CAB.DTENTSAI,CAB.DTNEG), CAB.ORDEMCARGA, PRO.CODGRUPOPROD, GRU.DESCRGRUPOPROD, LIN.CODLIN, LIN.DESCLIN
,PRO.CODMARCA, NVL(MAR.DESCRICAO,PRO.MARCA), PAR.CODCID, CID.NOMECID, CAB.CODPARC, PAR.RAZAOSOCIAL, UFS.CODUF, UFS.UF, PRO.CODPARCFORN, FRN.RAZAOSOCIAL, CAB.CODVEND
,VEN.APELIDO, ITE.CODPROD, PRO.DESCRPROD, VEN.COMVENDA, VEN.AD_BASECALCCOM,CAB.NUNOTA, CAB.NUMNOTA, TPO.GRUPO, CAB.CODTIPOPER, TPO.DESCROPER
,TPO.AD_OPERADOR
,TPO.AD_LUCRATIVIDADE, LOCAL, CAB.AD_ANOMES, CAB.AD_ANO=>select COM erro
SELECT ….
, NVL(VEN.COMVENDA, 0) AS PERCCOMDEV
, VEN.AD_BASECALCCOM AS BCCOM
–, EMP.AD_COMPLAT AS PERCPLAT
, NVL((SELECT C1.PERCCOM PERCCOMI FROM AD_COMECOMMERCE C1 WHERE C1.DTAVIGENCIA = (SELECT max(C1.DTAVIGENCIA) AS DTAVIGENCIA FROM AD_COMECOMMERCE C1 WHERE C1.DTAVIGENCIA <= CAB.DTNEG AND C1.CODEMP = CAB.CODEMP) AND C1.CODEMP = CAB.CODEMP) ,0) AS PERCPLAT ==> dá ERRO
, EMP.AD_COMECOMARG COMECOMARG
, TPO.AD_OPERADOR
, TPO.AD_LUCRATIVIDADE
, NULL AS LOCAL
, CAB.AD_ANOMES
, CAB.AD_ANO
, 0 AS VLRARMAZ
, 0 AS TOTVLRARMAZ
, 0 AS NUNOTACPA
, 0 AS CODEMPCPA
, 0 AS VLRCPA
, NULL AS DTENTSAICPA
, NULL AS COMPRADOR
FROM TGFCAB CAB INNER JOIN TGFPAR PAR ON PAR.CODPARC = CAB.CODPARC
INNER JOIN TSICID CID ON CID.CODCID = PAR.CODCID
INNER JOIN TSIUFS UFS ON UFS.CODUF = CID.UF
INNER JOIN TGFTOP TPO ON TPO.CODTIPOPER = CAB.CODTIPOPER AND TPO.DHALTER = CAB.DHTIPOPER
INNER JOIN TGFITE ITE ON ITE.NUNOTA = CAB.NUNOTA
INNER JOIN TGFEMP EMP ON EMP.CODEMP = CAB.CODEMP
INNER JOIN TGFPRO PRO ON PRO.CODPROD = ITE.CODPROD
LEFT JOIN TGFMAR MAR ON MAR.CODIGO = PRO.CODMARCA
LEFT JOIN TGFPAR FRN ON FRN.CODPARC = PRO.CODPARCFORN
INNER JOIN TGFGRU GRU ON GRU.CODGRUPOPROD = PRO.CODGRUPOPROD
LEFT JOIN TGFVEN VEN ON VEN.CODVEND = CAB.CODVEND
LEFT JOIN TCP_IMPOSTOS IMP ON IMP.NUNOTA = ITE.NUNOTA AND IMP.SEQUENCIA = ITE.SEQUENCIA
LEFT JOIN AD_LINPROD LIN ON GRU.AD_CODLINPROD = LIN.CODLIN
WHERE TPO.GOLDEV = -1
GROUP BY CAB.CODEMP, EMP.AD_COMPLAT, EMP.AD_COMECOMARG, NVL(CAB.DTENTSAI,CAB.DTNEG), CAB.ORDEMCARGA, PRO.CODGRUPOPROD, GRU.DESCRGRUPOPROD, LIN.CODLIN, LIN.DESCLIN
,PRO.CODMARCA, NVL(MAR.DESCRICAO,PRO.MARCA), PAR.CODCID, CID.NOMECID, CAB.CODPARC, PAR.RAZAOSOCIAL, UFS.CODUF, UFS.UF, PRO.CODPARCFORN, FRN.RAZAOSOCIAL, CAB.CODVEND
,VEN.APELIDO, ITE.CODPROD, PRO.DESCRPROD, VEN.COMVENDA, VEN.AD_BASECALCCOM,CAB.NUNOTA, CAB.NUMNOTA, TPO.GRUPO, CAB.CODTIPOPER, TPO.DESCROPER
,TPO.AD_OPERADOR
,TPO.AD_LUCRATIVIDADE, LOCAL, CAB.AD_ANOMES, CAB.AD_ANOQual é o problema ?
18 de novembro de 2021 às 11:55 am #152056José Laurindo ChiappaModeradorBom, de cara tua query (alinhando E colocando em case style diferente, pra poder visualizar melhor) ficou :
, NVL( (SELECT C1.PERCCOM PERCCOMI FROM AD_COMECOMMERCE C1 WHERE C1.DTAVIGENCIA = (Select max(C1.DTAVIGENCIA) AS DTAVIGENCIA from AD_COMECOMMERCE C1 Where C1.DTAVIGENCIA <= CAB.DTNEG And C1.CODEMP = CAB.CODEMP ) AND C1.CODEMP = CAB.CODEMP ,0) AS PERCPLAT
Dá pra ver que vc usa o MESMO EXATO ALIAS de C1 para DOIS SELECTs Diferentes, que (obviamente) trazem colunas Diferentes!!! Não admira ele te dar erro… Corrija isso, plz…
[]s
Chiappa
18 de novembro de 2021 às 1:42 pm #152069ElizaParticipanteoi Chiappa,
Verdade.. tinha esquecido de corrigir. Aliás, corrigi mas copiei a versão anterior.
Resumi a pesquisa:
select cab.codemp, cab.nunota
, CAB.CODTIPOPER
, ITE.CODPROD
, SUM(NVL(ITE.QTDNEG,0)) AS QTDNEGDEV
, NVL((SELECT C1.PERCCOM AS PERCCOMI FROM AD_COMECOMMERCE C1 WHERE C1.DTAVIGENCIA =
(SELECT max(C2.DTAVIGENCIA) FROM AD_COMECOMMERCE C2 WHERE C2.DTAVIGENCIA <= CAB.DTNEG AND C2.CODEMP = CAB.CODEMP) AND C1.CODEMP = CAB.CODEMP),0) AS PERCPLAT
FROM TGFCAB CAB
INNER JOIN TGFITE ITE ON ITE.NUNOTA = CAB.NUNOTA
INNER JOIN TGFTOP TPO ON TPO.CODTIPOPER = CAB.CODTIPOPER
where cab.dtneg = ’01/09/2021′
group by cab.codemp, cab.nunota, CAB.CODTIPOPER, ITE.CODPRODDeve ser um erro simples mas acredita que eu não consegui descobrir porque o erro de Group by ?
18 de novembro de 2021 às 2:04 pm #152070José Laurindo ChiappaModeradorCorrigida a issue apontada, não vejo mais nada questionável, A NÃO SER a linha :
where cab.dtneg = ’01/09/2021′
cfrme acredito que vc saiba, se DTNEG é do datatype DATE vc ** TEM ** que fazer conversão Explícita da sua string pra evitar erros de formato, a linha deveria ser :
where cab.dtneg = to_date(’01/09/2021′, ‘dd/mm/yyyy’)
Mas isso não tem NADA A VER com o erro atual… Olhando por cima, a sintaxe agora está correta, então com CERTEZA é alguma issue com os seus dados : talvez numa das tabelas o nome de uma das colunas mencionadas é outro, OU talvez a tua query colunar que popula essa coluna PERCPLAT esteja retornando mais de uma linha, OU talvez vc já tenha numa das tabelas uma outra coluna chamada PERCPLAT …. Enfim, me parece ser questão local aí do seu database e dos seus dados, não parece ser nada de sintaxe, genérico, absolutamente não…
18 de novembro de 2021 às 5:46 pm #152086ElizaParticipanteopa… obrigada pelo retorno.
Vou dar uma olhada na base de dadeo.
18 de novembro de 2021 às 5:52 pm #152087José Laurindo ChiappaModeradorSugestão adicional : executa a mesma query pelo sqlplus, que muitas vezes ele põe um ‘*’ exatamente abaixo da linha/coluna com erro, se ele conseguir identificar, tenta lá…
19 de novembro de 2021 às 10:54 am #152099ElizaParticipanteConsegui contornar colocando o AVG. Testei em um período grande e parece que deu certo.
select cab.codemp, cab.nunota
, CAB.CODTIPOPER
, ITE.CODPROD
, SUM(NVL(ITE.QTDNEG,0)) AS QTDNEGDEV
, AVG( NVL((SELECT C1.PERCCOM AS PERCCOMI FROM AD_COMECOMMERCE C1 WHERE C1.DTAVIGENCIA =
(SELECT max(C2.DTAVIGENCIA) FROM AD_COMECOMMERCE C2 WHERE C2.DTAVIGENCIA <= CAB.DTNEG AND C2.CODEMP = CAB.CODEMP) AND C1.CODEMP = CAB.CODEMP),0)) AS PERCPLAT
FROM TGFCAB CAB
INNER JOIN TGFITE ITE ON ITE.NUNOTA = CAB.NUNOTA
INNER JOIN TGFTOP TPO ON TPO.CODTIPOPER = CAB.CODTIPOPER
where cab.dtneg = ’01/09/2021′
group by cab.codemp, cab.nunota, CAB.CODTIPOPER, ITE.CODPROD19 de novembro de 2021 às 3:08 pm #152121José Laurindo ChiappaModeradorA função AVG é uma função de grupo, ie, uma função que transforma múltiplos valores num só, no caso calculando a média aritmética (AVeraGe) : pelo jeito, foi exatamente o que eu disse, ie, a query colunar estava trazendo mais de um registro, aí com o AVG vc transformou os n registros num só, extraindo a média….
Abraços,
José Laurindo Chiappa
19 de novembro de 2021 às 5:49 pm #152122ElizaParticipanteObrigada pela dica. 🙂
-
AutorPosts
- Você deve fazer login para responder a este tópico.