AJUDA SQL
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.
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.
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?
Isto, eu preciso selecionar somente se o KM_HORA for maior que as colunas (km, oleo, ar, filtro ou pneu) da outra tabela.
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).
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).
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.
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.
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 ...
Exemplo:
sua consulta sql
group By Campo1, campo2, Campo3 ...
Paulo , alterei a seção do seu tópico para a seção SQL / DATABASE
Eu to usando o firebird com o visual reportx para a impressão de relatorios e o group by da erro.
Ninguem?
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.
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