Array
(
)

ERRO ORA-00979: não é uma expressão GROUP BY

André Silva
   - 29 jul 2015

No final da query abaixo estou tentando fazer um GROUP BY , mais esta dando o seguinte erro: ORA-00979: não é uma expressão GROUP BY
Segue a Query:
SELECT
CAB.DTFATUR,
CAB.NUMNOTA,
PAR.NOMEPARC,
PRO.DESCRPROD,
CID.NOMECID,
UFS.UF,
PRO.MARCA,
VEN.APELIDO,
(ITE.QTDNEG) * TP0.GOLDEV AS QTD,
((ITE.VLRTOT - ITE.VLRDESC + ITE.VLRIPI + ITE.VLRSUBST) * TP0.GOLDEV)/((ITE.QTDNEG) * TP0.GOLDEV) AS VLRUNIT,
(ITE.VLRTOT - ITE.VLRDESC + ITE.VLRIPI + ITE.VLRSUBST) * TP0.GOLDEV AS VLRTOT,
(
SELECT
SUM (MET2.VLRTOT)
FROM AD_VENMET MET2
WHERE TRUNC(MET2.REFERENCIA) BETWEEN (CASE WHEN EXTRACT (DAY FROM SYSDATE) > 25 THEN TRUNC(SYSDATE+10,'MM')
ELSE TRUNC(SYSDATE,'MM') END )
AND (CASE WHEN EXTRACT (DAY FROM SYSDATE) > 25 THEN TRUNC(LAST_DAY(sysdate+10))
ELSE TRUNC(LAST_DAY(sysdate)) END)
AND MET2.CODVEND = VEN.CODVEND
)AS META,
(
SELECT
SUM((ITE2.VLRTOT - ITE2.VLRDESC + ITE2.VLRIPI + ITE2.VLRSUBST) * TP02.GOLDEV)
FROM TGFITE ITE2
INNER JOIN TGFCAB CAB2 ON (ITE2.NUNOTA = CAB2.NUNOTA)
INNER JOIN TGFTOP TP02 ON (TP02.CODTIPOPER = CAB2.CODTIPOPER AND TP02.DHALTER = CAB2.DHTIPOPER)
INNER JOIN TSIPAR PARAM ON (PARAM.CHAVE = 'DIAAPURACAOFOLH')
WHERE CAB2.CODVEND = CAB.CODVEND
AND TP02.GOLSINAL = -1
AND CAB2.STATUSNOTA = 'L'
AND CAB2.STATUSNFE = 'A'
AND TRUNC(CAB2.DTFATUR) BETWEEN (CASE WHEN EXTRACT (DAY FROM SYSDATE) > 25 THEN TRUNC(ADD_MONTHS(TO_DATE(TO_CHAR((TO_CHAR(SYSDATE,'MMYYYY')),'000000'),'MMYYYY') ,0))+PARAM.INTEIRO-1
ELSE TRUNC(ADD_MONTHS(TO_DATE(TO_CHAR((TO_CHAR(SYSDATE,'MMYYYY')),'000000'),'MMYYYY') ,-1)+PARAM.INTEIRO-1) END)
AND (CASE WHEN EXTRACT (DAY FROM SYSDATE) > 25 THEN TRUNC(ADD_MONTHS(TO_DATE(TO_CHAR((TO_CHAR(SYSDATE,'MMYYYY')),'000000'),'MMYYYY') ,+1))+PARAM.INTEIRO-2
ELSE TRUNC(ADD_MONTHS(TO_DATE(TO_CHAR((TO_CHAR(SYSDATE,'MMYYYY')),'000000'),'MMYYYY') ,0 )+PARAM.INTEIRO-2) END)
) AS TOTVEND
FROM
TGFCAB CAB
INNER JOIN TGFPAR PAR ON (PAR.CODPARC = CAB.CODPARC)
INNER JOIN TSICID CID ON (CID.CODCID = PAR.CODCID)
INNER JOIN TGFITE ITE ON (ITE.NUNOTA = CAB.NUNOTA)
INNER JOIN TGFPRO PRO ON (PRO.CODPROD = ITE.CODPROD)
INNER JOIN TGFTOP TP0 ON (TP0.CODTIPOPER = CAB.CODTIPOPER AND TP0.DHALTER = CAB.DHTIPOPER)
INNER JOIN TGFVEN VEN ON (VEN.CODVEND = ITE.CODVEND)
INNER JOIN TGFVEN VEN ON (VEN.CODVEND = ITE.CODVEND)
INNER JOIN TSIUFS UFS ON (UFS.CODUF = CID.UF)
INNER JOIN AD_VENMET MET ON (MET.CODVEND = VEN.CODVEND)
INNER JOIN TSIPAR PARAM ON (PARAM.CHAVE = 'DIAAPURACAOFOLH')
WHERE TRUNC(CAB.DTFATUR) BETWEEN (CASE WHEN EXTRACT (DAY FROM SYSDATE) > 25 THEN TRUNC(ADD_MONTHS(TO_DATE(TO_CHAR((TO_CHAR(SYSDATE,'MMYYYY')),'000000'),'MMYYYY') ,0))+PARAM.INTEIRO-1
ELSE TRUNC(ADD_MONTHS(TO_DATE(TO_CHAR((TO_CHAR(SYSDATE,'MMYYYY')),'000000'),'MMYYYY') ,-1)+PARAM.INTEIRO-1) END)
AND (CASE WHEN EXTRACT (DAY FROM SYSDATE) > 25 THEN TRUNC(ADD_MONTHS(TO_DATE(TO_CHAR((TO_CHAR(SYSDATE,'MMYYYY')),'000000'),'MMYYYY') ,+1))+PARAM.INTEIRO-2
ELSE TRUNC(ADD_MONTHS(TO_DATE(TO_CHAR((TO_CHAR(SYSDATE,'MMYYYY')),'000000'),'MMYYYY') ,0 )+PARAM.INTEIRO-2) END)
AND TP0.GOLSINAL = -1
AND CAB.STATUSNOTA = 'L'
AND CAB.STATUSNFE = 'A'
AND VEN.CODVEND = 10
GROUP BY CAB.DTFATUR,
CAB.NUMNOTA,
PAR.NOMEPARC,
PRO.DESCRPROD,
CID.NOMECID,
UFS.UF,
PRO.MARCA,
VEN.APELIDO,
(ITE.QTDNEG) * TP0.GOLDEV,
((ITE.VLRTOT - ITE.VLRDESC + ITE.VLRIPI + ITE.VLRSUBST) * TP0.GOLDEV)/((ITE.QTDNEG) * TP0.GOLDEV),
(ITE.VLRTOT - ITE.VLRDESC + ITE.VLRIPI + ITE.VLRSUBST) * TP0.GOLDEV
ORDER BY PRO.DESCRPROD,
CAB.DTFATUR

Dmelo
|
MVP
    29 jul 2015

Olá André,

Essa mensagem aparece por dois motivos:

1. Você executou um SELECT que contem um GROUP BY mas não tem as funções de agrupamento tais como MIN, MAX, SUM ou COUNT.

Veja um exemplo que eu fiz bem simples:

CREATE TABLE t1_teste ( quantidade int, produto varchar2(10));

/
INSERT INTO t1_teste
VALUES (1,
'carro');

INSERT INTO t1_teste
VALUES (2,
'carro');

INSERT INTO t1_teste
VALUES (2,
'moto');

INSERT INTO t1_teste
VALUES (4,
'caminhao');

/
COMMIT;

/ -- QUERO SABER A QUANTIDADE POR PRODUTOS mas a query abaixo não funciona, retorna o mesmo erro que você tem

SELECT quantidade,
produto
FROM t1_teste
GROUP BY produto;

-- DESTA FORMA FUNCIONA

SELECT sum(quantidade) qnt,
produto
FROM t1_teste
GROUP BY produto;

João Antonio
|
MVP
Pontos: 120
    01 set 2015

Boa tarde André,

Seu sql não tem função de agrupamento não há necessidade de usar o group by.

Att
João Antonio