Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

luciano_lka

Union na mesma tabela

Recommended Posts

Olá, Preciso fazer union na mesma tabela para pegar os pedidos de um periodo sem inatividade e pegar também os clientes que não tem pedidos nenhum durante esse periodo, tenho a seguinte query :

 

SELECT
CLIENTE.CODECLI,
CLIENTE.FANTASIA,
CLIENTE.EMAIL,
CLIENTE.TELEFONE,
CLIENTE_REPRESENTANTE.RAZAO,
MAX(PED_CAB.PEDIDO),
MAX(PED_CAB.DT_PED),
UF_CODIGOS.UF

FROM CLIENTE

INNER JOIN "PED_CAB" PED_CAB
ON CLIENTE.CODECLI = PED_CAB.CODECLI
INNER JOIN "CLIENTE_REPRESENTANTE" CLIENTE_REPRESENTANTE
ON CLIENTE."RAZAOSOCIAL" = CLIENTE_REPRESENTANTE."RAZAO"
INNER JOIN "ENDERECO_CLI" ENDERECO_CLI
ON PED_CAB.CODECLI = ENDERECO_CLI.CODECLI
INNER JOIN "UF_CODIGOS" UF_CODIGOS
ON ENDERECO_CLI.ESTADO_ID = UF_CODIGOS.COD_NACIONAL

WHERE
(DATEDIFF(DAY,PED_CAB.DT_PED, getdate()) >= 150)
UNION

SELECT
CLIENTE.CODECLI,
CLIENTE.FANTASIA,
CLIENTE.EMAIL,
CLIENTE.TELEFONE,
CLIENTE_REPRESENTANTE.RAZAO,
null,
NULL,
UF_CODIGOS.UF

FROM CLIENTE
INNER JOIN "PED_CAB" PED_CAB
ON CLIENTE.CODECLI = PED_CAB.CODECLI
INNER JOIN "CLIENTE_REPRESENTANTE" CLIENTE_REPRESENTANTE
ON CLIENTE."RAZAOSOCIAL" = CLIENTE_REPRESENTANTE."RAZAO"
INNER JOIN "ENDERECO_CLI" ENDERECO_CLI
ON PED_CAB.CODECLI = ENDERECO_CLI.CODECLI
INNER JOIN "UF_CODIGOS" UF_CODIGOS
ON ENDERECO_CLI.ESTADO_ID = UF_CODIGOS.COD_NACIONAL

WHERE
not exists(Select CLIENTE.CODECLI FROM CLIENTE WHERE PED_CAB.CODECLI = CLIENTE.CODECLI)

GROUP BY
CLIENTE.CODECLI,
CLIENTE.FANTASIA,
CLIENTE_REPRESENTANTE.RAZAO,
--PED_CAB.PEDIDO,
--PED_CAB.DT_PED,
UF_CODIGOS.UF

ORDER BY
CLIENTE.FANTASIA ASC,
CLIENTE_REPRESENTANTE.RAZAO ASC

 

Porém dá o seguinte erro que não consigo eliminar:

 

Column 'CLIENTE.CODECLI' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

 

Alguém poderia dar uma dica ?

 

Obrigado

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Luciano! tranquilo?

 

Cara, a mensagem de erro é porque suas funções de agregação MAX() estão no primeiro script e o group by ta no segundo.... E creio que o Union não é necessário... pode fazer alterações na primeira query utilizando o Left join, subindo a condição do where pro join com a tabela de pedidos e alterando o join da tabela de endereçõs pra fazer com o codecli da tabela de clientes, e não de pedidos... Segue a query alterada, teste ai!

 

SELECT
CLIENTE.CODECLI,
CLIENTE.FANTASIA,
CLIENTE.EMAIL,
CLIENTE.TELEFONE,
CLIENTE_REPRESENTANTE.RAZAO,
MAX(PED_CAB.PEDIDO),
MAX(PED_CAB.DT_PED),
UF_CODIGOS.UF
FROM CLIENTE
LEFT JOIN PED_CAB
ON CLIENTE.CODECLI = PED_CAB.CODECLI
AND (DATEDIFF(DAY,PED_CAB.DT_PED, getdate()) >= 150)
INNER JOIN CLIENTE_REPRESENTANTE
ON CLIENTE."RAZAOSOCIAL" = CLIENTE_REPRESENTANTE."RAZAO"
INNER JOIN ENDERECO_CLI
ON CLIENTE.CODECLI = ENDERECO_CLI.CODECLI
INNER JOIN UF_CODIGOS
ON ENDERECO_CLI.ESTADO_ID = UF_CODIGOS.COD_NACIONAL
GROUP BY
CLIENTE.CODECLI,
CLIENTE.FANTASIA,
CLIENTE.EMAIL,
CLIENTE.TELEFONE,
CLIENTE_REPRESENTANTE.RAZAO,
UF_CODIGOS.UF
Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Diemerson, deu quase certo na validação dos dados, encontrei um pedido com data de 18/09/2015, até aí a data

é maior que 150 dias, porém no campo pedido e data, aparece como null e deveria aparecer a data e o pedido.

Estou procurando validar outros dados, mas até agora apareceu esse caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala, Luciano! tranquilo?

 

A integridade referencial (pk no codecli da cliente e fk na codecli do pedido) ta ok? tipo, esse pedido do dia 18/09/2015, tem algum cliente vinculado a ele? ele não apareceu na consulta, correto?

 

talvez o cliente não esteja relacionado em uma dessas tabelas...

 

INNER JOIN CLIENTE_REPRESENTANTE
ON CLIENTE."RAZAOSOCIAL" = CLIENTE_REPRESENTANTE."RAZAO"
INNER JOIN ENDERECO_CLI
ON CLIENTE.CODECLI = ENDERECO_CLI.CODECLI
INNER JOIN UF_CODIGOS
ON ENDERECO_CLI.ESTADO_ID = UF_CODIGOS.COD_NACIONAL
tipo se a razão social estiver diferente, ele será excluido nesse join
INNER JOIN CLIENTE_REPRESENTANTE
ON CLIENTE."RAZAOSOCIAL" = CLIENTE_REPRESENTANTE."RAZAO"
talvez alguma abreviação no cliente desse pedido, é melhor fazer joins por ID, se tiver um carácter a mais como um espaço, pode ser que algum cliente não apareça. não teria o CODECLI na tabela CLIENTE_REPRESENTANTE?

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.