Fórum Group By - Apresentando mensagem de erro #617394

17/12/2021

0

/*ERRO APRESENTADO

INVALID EXPRESSION IN THE SELECT LIST (NOT CONTAINED IN EITHER AN
AGGREGATE FUNCTION OR THE GROUP BY CALUSE)

*/



SELECT
/*SAIDA*/
GELANSAI.ITEM ITEM_SAIDA,
GECADSAI.DATA DATA_SAIDA,
SUM(GELANSAI.QTDE) QTDE_SAIDA,
SUM(GELANSAI.VLRMED) VLRMED_SAIDA,
GECADSAI.CDC CDC_SAIDA,
/*ITENS*/
I.NOME,
I.UNI_CON,
I.CUSTO VLR_UNI,
(SELECT FIRST 1 GEGRUPOS.NOME FROM GEGRUPOS WHERE GEGRUPOS.COD = I.GRU) GRUPO,
(SELECT FIRST 1 NOME FROM TBCENCUS WHERE COD=GECADSAI.CDC) CDC,
/*DEVOLUCAO*/
GELANDEV.ITEM ITEM_DEV,
GECADDEV.DATA DATA_DEV,
SUM(GELANDEV.QTDE) QTDE_DEV,
SUM(GELANDEV.VLRMED) VLRMED_DEV,
GECADDEV.CDC CDC_DEV

FROM GECADSAI
LEFT JOIN GELANSAI ON GECADSAI.ANO=GELANSAI.ANO
AND GECADSAI.MES=GELANSAI.MES
AND GECADSAI.DOC=GELANSAI.DOC
LEFT JOIN GEITENS I ON GELANSAI.ITEM=I.COD
LEFT JOIN TBCENCUS T ON T.COD=GECADSAI.CDC
LEFT JOIN GELANDEV ON GELANDEV.ID_GELANSAI=GELANSAI.ID_GELANSAI
LEFT JOIN GECADDEV ON GECADDEV.ID=GELANDEV.ID_GECADDEV
WHERE GECADSAI.ANO=:ANO
AND GECADSAI.MES=:MES
AND (
(NOT GECADSAI.CDC IS NULL AND GECADSAI.CDC BETWEEN :CDC1 AND :CDC2)
OR
(NOT GECADDEV.CDC IS NULL AND GECADDEV.CDC BETWEEN :CDC1 AND :CDC2)
)
AND (
(NOT GECADSAI.DATA IS NULL AND GECADSAI.DATA BETWEEN :DATA1 AND :DATA2)
OR
(NOT GECADDEV.DATA IS NULL AND GECADDEV.DATA BETWEEN :DATA1 AND :DATA2)
)
AND (COALESCE(GELANSAI.CONSOL,'')='T' OR COALESCE(GECADSAI.CONSOL,'')='T')
GROUP BY GELANSAI.ITEM,
GECADSAI.DATA,
GELANSAI.QTDE,
GELANSAI.VLRMED,
GECADSAI.CDC,
I.NOME,
I.CUSTO,
GELANDEV.ITEM,
GECADDEV.DATA,
GELANDEV.QTDE,
GELANDEV.VLRMED,
GECADDEV.CDC
ORDER BY CDC,
NOME,
GELANSAI.ITEM,
GECADSAI.DATA,
GELANSAI.QTDE,
GELANSAI.VLRMED,
GECADSAI.CDC,
I.NOME,
I.CUSTO,
GELANDEV.ITEM,
GECADDEV.DATA,
GELANDEV.QTDE,
GELANDEV.VLRMED,
GECADDEV.CDC
Marcos Batista

Marcos Batista

Responder

Post mais votado

17/12/2021

você tem o campo
I.UNI_CON
na SELECT, mas não tem na GROUP BY

não faz sentido ter na GROUP BY os campos
GELANSAI.QTDE,
GELANSAI.VLRMED,
GELANDEV.QTDE,
GELANDEV.VLRMED,
porque eles são acumulados pela função de agregação SUM()

a ordenação abaixo ira gerar o erro de ambiguidade, porque há campos CDC em duas tabelas e o nome já está indicado lá embaixo (I.NOME).
ORDER BY
CDC,
NOME

Emerson Nascimento

Emerson Nascimento
Responder

Gostei + 1

Mais Posts

17/12/2021

Marcos Batista

você tem o campo
I.UNI_CON
na SELECT, mas não tem na GROUP BY

não faz sentido ter na GROUP BY os campos
GELANSAI.QTDE,
GELANSAI.VLRMED,
GELANDEV.QTDE,
GELANDEV.VLRMED,
porque eles são acumulados pela função de agregação SUM()

a ordenação abaixo ira gerar o erro de ambiguidade, porque há campos CDC em duas tabelas e o nome já está indicado lá embaixo (I.NOME).
ORDER BY
CDC,
NOME

Ler Mais...





Fiz da maneira que falou mas continua apresentando o mesmo erro, segue a query como ficou (utilizo o firebird)

SELECT
/*SAIDA*/
GELANSAI.ITEM ITEM_SAIDA,
GECADSAI.DATA DATA_SAIDA,
SUM(GELANSAI.QTDE) QTDE_SAIDA,
SUM(GELANSAI.VLRMED) VLRMED_SAIDA,
GECADSAI.CDC CDC_SAIDA,
/*ITENS*/
I.NOME,
I.UNI_CON,
I.CUSTO VLR_UNI,
(SELECT FIRST 1 GEGRUPOS.NOME FROM GEGRUPOS WHERE GEGRUPOS.COD = I.GRU) GRUPO,
(SELECT FIRST 1 NOME FROM TBCENCUS WHERE COD=GECADSAI.CDC) CDC,
/*DEVOLUCAO*/
GELANDEV.ITEM ITEM_DEV,
GECADDEV.DATA DATA_DEV,
SUM(GELANDEV.QTDE) QTDE_DEV,
SUM(GELANDEV.VLRMED) VLRMED_DEV,
GECADDEV.CDC CDC_DEV

FROM GECADSAI
LEFT JOIN GELANSAI ON GECADSAI.ANO=GELANSAI.ANO
AND GECADSAI.MES=GELANSAI.MES
AND GECADSAI.DOC=GELANSAI.DOC
LEFT JOIN GEITENS I ON GELANSAI.ITEM=I.COD
LEFT JOIN TBCENCUS T ON T.COD=GECADSAI.CDC
LEFT JOIN GELANDEV ON GELANDEV.ID_GELANSAI=GELANSAI.ID_GELANSAI
LEFT JOIN GECADDEV ON GECADDEV.ID=GELANDEV.ID_GECADDEV
WHERE GECADSAI.ANO=:ANO
AND GECADSAI.MES=:MES
AND (
(NOT GECADSAI.CDC IS NULL AND GECADSAI.CDC BETWEEN :CDC1 AND :CDC2)
OR
(NOT GECADDEV.CDC IS NULL AND GECADDEV.CDC BETWEEN :CDC1 AND :CDC2)
)
AND (
(NOT GECADSAI.DATA IS NULL AND GECADSAI.DATA BETWEEN :DATA1 AND :DATA2)
OR
(NOT GECADDEV.DATA IS NULL AND GECADDEV.DATA BETWEEN :DATA1 AND :DATA2)
)
AND (COALESCE(GELANSAI.CONSOL,'')='T' OR COALESCE(GECADSAI.CONSOL,'')='T')
GROUP BY GELANSAI.ITEM,
GECADSAI.DATA,
GECADSAI.CDC,
I.NOME,
I.CUSTO,
I.UNI_CON,
GELANDEV.ITEM,
GECADDEV.DATA,
GECADDEV.CDC
ORDER BY GECADSAI.CDC,
I.NOME
Responder

Gostei + 0

17/12/2021

Emerson Nascimento

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
SELECT
    /*SAIDA*/
    GELANSAI.ITEM ITEM_SAIDA,
    GECADSAI.DATA DATA_SAIDA,
    SUM(GELANSAI.QTDE) QTDE_SAIDA,
    SUM(GELANSAI.VLRMED) VLRMED_SAIDA,
    GECADSAI.CDC CDC_SAIDA,
    /*ITENS*/
    I.NOME,
    I.UNI_CON,
    I.CUSTO VLR_UNI,
    (SELECT FIRST 1 GEGRUPOS.NOME FROM GEGRUPOS WHERE GEGRUPOS.COD = I.GRU) GRUPO,
    (SELECT FIRST 1 NOME FROM TBCENCUS WHERE COD=GECADSAI.CDC) CDC,
    /*DEVOLUCAO*/
    GELANDEV.ITEM ITEM_DEV,
    GECADDEV.DATA DATA_DEV,
    SUM(GELANDEV.QTDE) QTDE_DEV,
    SUM(GELANDEV.VLRMED) VLRMED_DEV,
    GECADDEV.CDC CDC_DEV
FROM
    GECADSAI
LEFT JOIN
    GELANSAI ON GECADSAI.ANO=GELANSAI.ANO
    AND GECADSAI.MES=GELANSAI.MES
    AND GECADSAI.DOC=GELANSAI.DOC
LEFT JOIN
    GEITENS I ON GELANSAI.ITEM=I.COD
LEFT JOIN
    TBCENCUS T ON T.COD=GECADSAI.CDC
LEFT JOIN
    GELANDEV ON GELANDEV.ID_GELANSAI=GELANSAI.ID_GELANSAI
LEFT JOIN
    GECADDEV ON GECADDEV.ID=GELANDEV.ID_GECADDEV
WHERE
    GECADSAI.ANO=:ANO
    AND GECADSAI.MES=:MES
    AND (
        (NOT GECADSAI.CDC IS NULL AND GECADSAI.CDC BETWEEN :CDC1 AND :CDC2)
        OR
        (NOT GECADDEV.CDC IS NULL AND GECADDEV.CDC BETWEEN :CDC1 AND :CDC2)
    )
    AND (
        (NOT GECADSAI.DATA IS NULL AND GECADSAI.DATA BETWEEN :DATA1 AND :DATA2)
        OR
        (NOT GECADDEV.DATA IS NULL AND GECADDEV.DATA BETWEEN :DATA1 AND :DATA2)
    )
    AND (COALESCE(GELANSAI.CONSOL,'')='T' OR COALESCE(GECADSAI.CONSOL,'')='T')
GROUP BY
    GELANSAI.ITEM,
    GECADSAI.DATA,
    GECADSAI.CDC,
    I.NOME,
    I.CUSTO,
    I.UNI_CON,
    GELANDEV.ITEM,
    GECADDEV.DATA,
    GECADDEV.CDC
ORDER BY
    GECADSAI.CDC,
    I.NOME


para testar, retire as linhas abaixo da instrução.
1
2
(SELECT FIRST 1 GEGRUPOS.NOME FROM GEGRUPOS WHERE GEGRUPOS.COD = I.GRU) GRUPO,
(SELECT FIRST 1 NOME FROM TBCENCUS WHERE COD=GECADSAI.CDC) CDC,
e uma pergunta: porque esse conteúdo não está num JOIN?

Responder

Gostei + 1

17/12/2021

Marcos Batista

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
SELECT
    /*SAIDA*/
    GELANSAI.ITEM ITEM_SAIDA,
    GECADSAI.DATA DATA_SAIDA,
    SUM(GELANSAI.QTDE) QTDE_SAIDA,
    SUM(GELANSAI.VLRMED) VLRMED_SAIDA,
    GECADSAI.CDC CDC_SAIDA,
    /*ITENS*/
    I.NOME,
    I.UNI_CON,
    I.CUSTO VLR_UNI,
    (SELECT FIRST 1 GEGRUPOS.NOME FROM GEGRUPOS WHERE GEGRUPOS.COD = I.GRU) GRUPO,
    (SELECT FIRST 1 NOME FROM TBCENCUS WHERE COD=GECADSAI.CDC) CDC,
    /*DEVOLUCAO*/
    GELANDEV.ITEM ITEM_DEV,
    GECADDEV.DATA DATA_DEV,
    SUM(GELANDEV.QTDE) QTDE_DEV,
    SUM(GELANDEV.VLRMED) VLRMED_DEV,
    GECADDEV.CDC CDC_DEV
FROM
    GECADSAI
LEFT JOIN
    GELANSAI ON GECADSAI.ANO=GELANSAI.ANO
    AND GECADSAI.MES=GELANSAI.MES
    AND GECADSAI.DOC=GELANSAI.DOC
LEFT JOIN
    GEITENS I ON GELANSAI.ITEM=I.COD
LEFT JOIN
    TBCENCUS T ON T.COD=GECADSAI.CDC
LEFT JOIN
    GELANDEV ON GELANDEV.ID_GELANSAI=GELANSAI.ID_GELANSAI
LEFT JOIN
    GECADDEV ON GECADDEV.ID=GELANDEV.ID_GECADDEV
WHERE
    GECADSAI.ANO=:ANO
    AND GECADSAI.MES=:MES
    AND (
        (NOT GECADSAI.CDC IS NULL AND GECADSAI.CDC BETWEEN :CDC1 AND :CDC2)
        OR
        (NOT GECADDEV.CDC IS NULL AND GECADDEV.CDC BETWEEN :CDC1 AND :CDC2)
    )
    AND (
        (NOT GECADSAI.DATA IS NULL AND GECADSAI.DATA BETWEEN :DATA1 AND :DATA2)
        OR
        (NOT GECADDEV.DATA IS NULL AND GECADDEV.DATA BETWEEN :DATA1 AND :DATA2)
    )
    AND (COALESCE(GELANSAI.CONSOL,'')='T' OR COALESCE(GECADSAI.CONSOL,'')='T')
GROUP BY
    GELANSAI.ITEM,
    GECADSAI.DATA,
    GECADSAI.CDC,
    I.NOME,
    I.CUSTO,
    I.UNI_CON,
    GELANDEV.ITEM,
    GECADDEV.DATA,
    GECADDEV.CDC
ORDER BY
    GECADSAI.CDC,
    I.NOME


para testar, retire as linhas abaixo da instrução.
1
2
(SELECT FIRST 1 GEGRUPOS.NOME FROM GEGRUPOS WHERE GEGRUPOS.COD = I.GRU) GRUPO,
(SELECT FIRST 1 NOME FROM TBCENCUS WHERE COD=GECADSAI.CDC) CDC,
e uma pergunta: porque esse conteúdo não está num JOIN?

Ler Mais...




Deu certo meu amigo, muito obrigado!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar