AJUDA SQL

PAULOHSV 20/01/2010 15:33:45
#332418
Tenho as seguintes tabelas.

MANUTENCAO_EQUIPAMENTOS (
ID_MANUTENCAO_EQUIPAMENTOS INTEGER NOT NULL,
COD_MAQUINARIO INTEGER NOT NULL,
VALOR DOUBLE PRECISION NOT NULL,
DATA DATE,
PECAS BLOB SUB_TYPE 1 SEGMENT SIZE 80 NOT NULL,
SERVICOS BLOB SUB_TYPE 1 SEGMENT SIZE 80 NOT NULL,
COD_FUNCIONARIO INTEGER,
COD_FAZENDA INTEGER NOT NULL,
DATAPM DATE,
KM VARCHAR(30) COLLATE WIN_PTBR,
OLEO VARCHAR(30) COLLATE WIN_PTBR,
AR VARCHAR(30) COLLATE WIN_PTBR,
FILTRO_OLEO VARCHAR(30) COLLATE WIN_PTBR,
PNEU VARCHAR(30) COLLATE WIN_PTBR
);



ABASTECIMENTO (
ID_ABASTECIMENTO INTEGER NOT NULL,
COD_MAQUINARIO INTEGER NOT NULL,
DATA DATE,
HORA TIME,
KM_HORA VARCHAR(10) NOT NULL COLLATE WIN_PTBR,
QUANTIDADE DOUBLE PRECISION,
VALOR_UNITARIO DOUBLE PRECISION,
VALOR_TOTAL DOUBLE PRECISION,
COMBUSTIVEL VARCHAR(20) COLLATE WIN_PTBR,
COD_FUNCIONARIO INTEGER NOT NULL,
COD_FAZENDA INTEGER NOT NULL
);

Preciso selecionar os maquinarios onde o maior valor do campo km_hora da tabela abastecimento seja maior que o maior valor dos campos km, oleo, ar, filtro_oleo e pneu da tabela de manutenção equipamentos e a maior data da tabela abastecimento seja maior que a data da tabela manutenção equipamentos. Tendo como ligação das tabelas o codigo do maquinario. Alguem poderia me ajudar.
SINKERTEC 20/01/2010 16:32:03
#332424


Meu caro

Quer dizer q se o valor de KM_Hora for menor que um desses (km, oleo, ar, filtro ou pneu) já n serve pra vc?
PAULOHSV 21/01/2010 08:29:01
#332455
Isto, eu preciso selecionar somente se o KM_HORA for maior que as colunas (km, oleo, ar, filtro ou pneu) da outra tabela.
DEZ2 21/01/2010 08:58:11
#332465
Teste este aqui

Select Max(CONVERT(Decimal(18,2),ABASTECIMENTO.KM_HORA))
from ABASTECIMENTO inner Join MANUTENCAO_EQUIPAMENTOS on
ABASTECIMENTO.COD_MAQUINARIO = MANUTENCAO_EQUIPAMENTOS.COD_MAQUINARIO
Having
Max(CONVERT(Decimal(18,2),ABASTECIMENTO.KM_HORA)) > Max(CONVERT(Decimal(18,2),MANUTENCAO_EQUIPAMENTOS.KM))
And Max(CONVERT(Decimal(18,2),ABASTECIMENTO.KM_HORA)) > Max(CONVERT(Decimal(18,2),MANUTENCAO_EQUIPAMENTOS.OLEO))
And Max(CONVERT(Decimal(18,2),ABASTECIMENTO.KM_HORA)) > Max(CONVERT(Decimal(18,2),MANUTENCAO_EQUIPAMENTOS.AR))
And Max(CONVERT(Decimal(18,2),ABASTECIMENTO.KM_HORA)) > Max(CONVERT(Decimal(18,2),MANUTENCAO_EQUIPAMENTOS.FILTRO_OLEO))
And Max(CONVERT(Decimal(18,2),ABASTECIMENTO.KM_HORA)) > Max(CONVERT(Decimal(18,2),MANUTENCAO_EQUIPAMENTOS.PNEU))

Este é o script para SqlServer utilizei o convert, pois na tabela o campo está varchar(30).

PAULOHSV 21/01/2010 15:09:03
#332506
Adaptando o codigo cheguei a seguinte sql

SQL = [Ô]Select max(ABASTECIMENTO.KM_HORA) as KM_HORA[Ô] & _
[Ô] from (ABASTECIMENTO inner Join MANUTENCAO_EQUIPAMENTOS on [Ô] & _
[Ô] ABASTECIMENTO.COD_MAQUINARIO = MANUTENCAO_EQUIPAMENTOS.COD_MAQUINARIO)[Ô] & _
[Ô] Having[Ô] & _
[Ô] Max (ABASTECIMENTO.KM_HORA) >= Max(MANUTENCAO_EQUIPAMENTOS.KM) [Ô] & _
[Ô] OR Max(ABASTECIMENTO.KM_HORA) >= Max(MANUTENCAO_EQUIPAMENTOS.OLEO)[Ô] & _
[Ô] OR Max(ABASTECIMENTO.KM_HORA) >= Max(MANUTENCAO_EQUIPAMENTOS.AR) [Ô] & _
[Ô] OR Max(ABASTECIMENTO.KM_HORA) >= Max(MANUTENCAO_EQUIPAMENTOS.FILTRO_OLEO)[Ô] & _
[Ô] OR Max(ABASTECIMENTO.KM_HORA) >= Max(MANUTENCAO_EQUIPAMENTOS.PNEU)[Ô] & _
[Ô] OR Max(ABASTECIMENTO.DATA) >= Max(MANUTENCAO_EQUIPAMENTOS.DATAPM)[Ô]

Porem ele retorna so o maior registro e não todos os registros como eu precisava, mas se eu tirar o max(ABASTECIMENTO.KM_HORA) as KM_HORA e deixar somente o ABASTECIMENTO.KM_HORA no começo da sql da erro.
DEZ2 21/01/2010 18:07:51
#332542
Para não da erro você deve agrupar os outros campos que não utilizam max
Exemplo:
sua consulta sql
group By Campo1, campo2, Campo3 ...
FOXMAN 21/01/2010 20:07:21
#332549
Paulo , alterei a seção do seu tópico para a seção SQL / DATABASE
PAULOHSV 22/01/2010 09:39:48
#332585
Eu to usando o firebird com o visual reportx para a impressão de relatorios e o group by da erro.
PAULOHSV 27/01/2010 12:55:33
#332949
Ninguem?
PAULOHSV 28/01/2010 08:14:24
#332981
Uma outra forma que eu poderia fazer seria assim:

SELECT ABASTECIMENTO.KM_HORA FROM MANUTENCAO_EQUIPAMENTOS INNER JOIN ABASTECIMENTO ON (MANUTENCAO_EQUIPAMENTOS.COD_MAQUINARIO = ABASTECIMENTO.COD_MAQUINARIO) WHERE ABASTECIMENTO.KM_HORA>=MAX(MANUTENCAO_EQUIPAMENTO.KM) OR ABASTECIMENTO.KM_HORA>=MAX(MANUTENCAO_EQUIPAMENTO.AR) ....

porem não é permitido o max dentro da clausula where, como contornar este problema.
Tópico encerrado , respostas não são mais permitidas