SubSelect com union all, order by e group by

Firebird

16/09/2016

Estou tendo umas dificuldades com um sql..
SELECT
  TABNOV.NUMERO_PROCESSO,
  TABNOV.DATA_ANDAMENTO,
  TABNOV.DATA_PUBLICACAO,
  TABNOV.STATUS,
  CLIENTES.NOME_CLIENTE,
FROM
  (select
     T1.NUMERO_PROCESSO,
     MAX(T3.DATA) as DATA_ANDAMENTO,
     MAX(T4.DATA) as DATA_PUBLICACAO,
     T1.DATA_ESCRITORIO,
     T1.DATA_DISTRIBUICAO,
     T1.STATUS,
     T1.COD_CLIENTE,
   from
     PROCESSOS T1
     	left join ANDAMENTOS_PROCESSUAIS T3 on T3.NUMERO_PROCESSO_AUX = T1.NUMERO_PROCESSO
        left join PUBLICACOES T4 on T4.NUMERO_PROCESSO_AUX = T1.NUMERO_PROCESSO
   union all
select
     T1.NUMERO_PROCESSO,
     MAX(T3.DATA) as DATA_ANDAMENTO,
     MAX(T4.DATA) as DATA_PUBLICACAO,
     T1.DATA_ESCRITORIO,
     T1.DATA_DISTRIBUICAO,
     T1.STATUS,
     T1.COD_CLIENTE,
   from
     PROCESSOS T1
     	left join ANDAMENTOS_PROCESSUAIS T3 on T3.NUMERO_PROCESSO_AUX = T1.NUMERO_PROCESSO
        left join PUBLICACOES T4 on T4.NUMERO_PROCESSO_AUX = T1.NUMERO_PROCESSO
   where                                      
     T1.NUMERO_PROCESSO2 <> "") TABNOV,
CLIENTES
WHERE
   TABNOV.COD_CLIENTE = CLIENTES.COD_CLIENTE
group by
     TABNOV.NUMERO_PROCESSO, TABNOV.STATUS, CLIENTES.NOME_CLIENTE
order by
  TABNOV.DATA_ANDAMENTO, TABNOV.NUMERO_PROCESSO


esse é só um resumo do SQL ele vai ate o 8 só que aparece uma erro
e como não tenho muita experiencia com SQL fico meio desorientado.
podem me ajudar?
Eduardo Silva

Eduardo Silva

Curtidas 0

Melhor post

Luiz Santos

Luiz Santos

19/09/2016

Eduardo, funciona assim.

Imagine esse select abaixo:

SELECT CODIGO, NOME
  FROM TABELA



Quando for ordenar a tabela você pode ordenar por CODIGO (coluna 1) ou NOME (coluna 2).
O SQL permite que você referencie a coluna por números no ORDER BY.
Assim, quando você coloca ORDER BY 1,2, quer dizer que está ordenando por CODIGO e NOME.
Ja um ORDER BY 2,1, quer dizer que você está ordenando por NOME e CODIGO

E o que o Dirceu falou está correto, quando você usa um GROUP BY, tem que colocar no GROUP todas as colunas que estão no seu SELECT que não estejam sendo agregadas.

No caso da sua QUERY, você está dando um MAX na data, mas está colocando o GROUP BY na query de fora.

Entendeu?

Grande abs
GOSTEI 2

Mais Respostas

Chrystian

Chrystian

16/09/2016

qual a mensagem de erro?
GOSTEI 0
Eduardo Silva

Eduardo Silva

16/09/2016

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
GOSTEI 0
Dirceu Morais

Dirceu Morais

16/09/2016

Não entendi bem o seu sql.

Posso estar falando besteira, mas no group by vc tem que acrescentar todos os campos do Select
TABNOV.NUMERO_PROCESSO,
TABNOV.DATA_ANDAMENTO,
TABNOV.DATA_PUBLICACAO,
TABNOV.STATUS,
CLIENTES.NOME_CLIENTE


e quando existe a clausula union o order by voce usa numeros.
se você quer organizar por TABNOV.DATA_ANDAMENTO, TABNOV.NUMERO_PROCESSO
então seria order assim:
Order by 2,1
GOSTEI 1
Eduardo Silva

Eduardo Silva

16/09/2016

Não entende o 2,1 vou colocar o Order by 2,1 e os campos ou só o 2,1
GOSTEI 0
Eduardo Silva

Eduardo Silva

16/09/2016

então eu não precisaria por o "GROUP BY" na parte fora do sub?
GOSTEI 0
Luiz Santos

Luiz Santos

16/09/2016

então eu não precisaria por o "GROUP BY" na parte fora do sub?


Isso.
Você só usa o Group By se usar alguma função de agregação (SUM, COUNT, AVG, MAX e MIN)
GOSTEI 1
Dirceu Morais

Dirceu Morais

16/09/2016

Ao invés de o nome do campo no ORDER BY você utiliza o número da posição que ele encontra na Select.

Se você tem por exemplo:
SELECT NUMERO_PROCESSO,  DATA_ANDAMENTO,  DATA_PUBLICACAO,  STATUS,  NOME_CLIENTE
FROM Cliente


Se você quiser ordenar pelo nome do cliente, você pode usar:

Order by Nome_cliente


ou


Order by 5
GOSTEI 1
Eduardo Silva

Eduardo Silva

16/09/2016

Pessoal Muito Obrigado! Foi de uma grande ajuda! muito abrigado por tudo


pode fechar o tópico
GOSTEI 0
POSTAR