O que estou fazendo errado , que não sai os valores na tabela ?

30 respostas
postgresql
F

30 Respostas

K

Boa tarde,

Você está tentando selecionar um elemento que não contém na tabela, que seria data inicio 01/03/2018, e data final 03/12/2018. Desta forma não irá retornar os registros entre as datas 01/03/2018 - 03/12/2018.

Teria que ser feita uma comparação como:

data_inicio>='01/03/2018' AND data_fim<='03/12/2018'

A data de inicio tem que ser maior ou igual a 01/03/2018, mas tem que ser menor do que 03/12/2018, tendo a condição AND, você estabelece que quer nesta faixa de datas.

F

obrigado , só que tem pegar o maior valor de aluguel e agora ?

K

Tenta especificar da onde você quer selecionar nome e max(valor), por exemplo se o nome é da tabela locatario, ficaria:

SELECT a.nome FROM locatario a;

F

F

e amigo ?

F

oi fiz o que você falou , não alterou em nada

Diego_Emmanuell

Acredito que precise fazer dois select ai um para retornar os dados e outro dento do where, onde você vai pedir apenas o max data

K

Eu fiz algumas alterações de teste, tenta tirar o GROUP BY

Diego_Emmanuell

Não testei, mas seria algo tipo isso:

select l.nome, l.valor from locatorio l, aluguel al where l.idLocatorio = al.idLocatorio and data_inicio >= '01/03/2018' and data_fim <= '03/12/2018' and l.valor = (select max(valor) from locatorio lo, aluguel alu where lo.idLocatorio = alu.idLocatorio and data_inicio >= '01/03/2018' and data_fim <= '03/12/2018')
rodevops

Usando GROUP BY vc está pegando o maior valor de aluguel por locatario, se vc quer o maior entre todos os locatarios, precisa retirar o GROUP BY pegou?

F

rodevops

Cara, posta o sql vai, imagens só com o erro, se a gente precisar alterar a query pra te ajudar fica dificil digitarmos do começo… data inicio e data fim são de qual tabela?

E não faça produto cartesiano, use join:

SELECT l.nome, MAX(al.valor) FROM locatario l
INNER JOIN aluguel al ON l.idLocatario = al.idLocatario 
AND al.data_inicio >= '01/03/2018' AND al.data_fim <= '03/12/2018';
F
CREATE TABLE Locatorio (

idlocatorio INTEGER NOT NULL,

nome VARCHAR(80) NOT NULL,

cpf VARCHAR(14) NOT NULL,

rg VARCHAR(14) NOT NULL,

sexo VARCHAR(1) NOT NULL,

datanascimento VARCHAR(10) NOT NULL,

PRIMARY KEY (idlocatorio)

);
CREATE TABLE Endereco (

idendereco INTEGER NOT NULL,

tipo_logradour VARCHAR(20) NOT NULL,

logradouro VARCHAR(80) NOT NULL,

numero_ VARCHAR(8) NOT NULL,

cep VARCHAR(15) NOT NULL,

bairro VARCHAR(80) NOT NULL,

cidade VARCHAR(50) NOT NULL,

estado VARCHAR(30) NOT NULL,

idlocatorio INTEGER NOT NULL,

PRIMARY KEY (idendereco),

FOREIGN KEY(idlocatorio) References Locatorio(idlocatorio)

);
CREATE TABLE Contato_ (

idcontato INTEGER NOT NULL,

tipo_contato VARCHAR(20) NOT NULL,

valor_contato VARCHAR(150) NOT NULL,

idlocatorio INTEGER NOT NULL,

PRIMARY KEY (idcontato),

FOREIGN KEY(idlocatorio) References Locatorio(idlocatorio)

);
CREATE TABLE Aluguel (

idaluguel INTEGER NOT NULL,

data_inicio VARCHAR(10) NOT NULL,

data_fim VARCHAR(10) NOT NULL,

km_inicio INTEGER NOT NULL,

km_fim INTEGER NOT NULL,

valor DOUBLE  PRECISION NOT NULL,

idlocatorio INTEGER NOT NULL,

PRIMARY KEY (idaluguel),

FOREIGN KEY(idlocatorio) References Locatorio(idlocatorio)

);
CREATE TABLE Grupo (

idgrupo INTEGER NOT NULL,

descricao_grupo VARCHAR(30) NOT NULL,

PRIMARY KEY (idgrupo)

);
CREATE TABLE Carro(

idcarro INTEGER NOT NULL,

nome VARCHAR(30) NOT NULL,

modelo VARCHAR(30) NOT NULL,

marca VARCHAR(30) NOT NULL,

ano INTEGER NOT NULL,

placa VARCHAR(10) NOT NULL,

quilometragem INTEGER NOT NULL,

idgrupo INTEGER NOT NULL,

PRIMARY KEY (idcarro),

FOREIGN KEY(idgrupo) REFERENCES Grupo(idgrupo)

);
CREATE TABLE Aluguel_Carro (

idaluguel INTEGER NOT NULL,

idcarro INTEGER NOT NULL,

PRIMARY KEY (idaluguel, idcarro),

FOREIGN KEY(idaluguel) REFERENCES Aluguel(idaluguel)

,

FOREIGN KEY(idcarro) REFERENCES Carro(idcarro)

);
rodevops

Jovem eu só te fiz a pergunta, não precisava postar sua base inteira! mas enfim, ajustei a query no post anterior, veja se atende… e pesquise sobre plano cartesiano em base, evite e de preferencia ao join

F

oi obrigado pela ajuda, mas o exercício é para fazer sem join , eu cheguei nisso daqui .

rodevops

se é sem join então nem produto cartesiano vc deveria usar (ele é um join forçado o que é pior ainda)… o exercicio deixa usa subquery?

F

sim

Diego_Emmanuell

Lá em cima eu postei uma sql que possa ser que ajude.

F

eu fiz isso , mas ele só me da o valor máximo e não o nome da pessoa, falta filtrar o nome .

Diego_Emmanuell

Isto não ajuda?

select l.nome, l.valor from locatorio l, aluguel al where l.idLocatorio = al.idLocatorio and data_inicio >= '01/03/2018' 
and data_fim <= '03/12/2018' and l.valor = (select max(valor) from locatorio lo, aluguel alu where lo.idLocatorio = alu.idLocatorio and data_inicio >= '01/03/2018' 
and data_fim <= '03/12/2018')
F

rodevops

Veja se resolve:

SELECT l.nome FROM locatario l, (
    SELECT idLocatario, MAX(valor) FROM aluguel 
    WHERE data_inicio >= '01/03/2018' AND data_fim <= '03/12/2018'
) t WHERE l.idLocatario = t.idLocatario;
F

deu certo nao

rodevops

Então não tem jeito vai ter que usar group by, ai vc limita em 1 no final

SELECT l.nome, MAX(al.valor) FROM locatario l, aluguel al 
WHERE l.idLocatario = al.idLocatario 
AND al.data_inicio >= '01/03/2018' AND al.data_fim <= '03/12/2018' 
GROUP BY l.nome ORDER BY MAX(al.valor) DESC LIMIT 1;

Obs: não tenho certeza se no postgres o MAX(al.valor) vai funcionar no ORDER BY mas não deixa de ser uma tentativa… boa sorte!

F

funfou cara, obrigado ai

F

Só não entendi por que tive que usar o order by ai .

rodevops

pra garantir o max do max entre os nomes agrupados, mesmo limitando 1, sem ele pode acontecer isso:

nome | valor
a    | 123
b    | 999

Nesse exemplo, limitando 1 o a será exibido e isso é errado, pq b é maior ainda,quando se usa o order desc vc inverte a ordem:

nome | valor
b    | 999
a    | 123

E limitando 1, o b será exibido, pegou? Macetes que só no dia a dia (leia-se necessidade) se aprende, sucesso nos estudos e pergunte ao professor sobre o cartesiano, vamos ver se ele vai saber responder ja que ele não deixou usar join, mas vc acabou usando mesmo assim…

F

Pode me ajudar em outro ?

rodevops

Abre outro tópico jovem!

F

abri ai já amigo .

Criado 28 de novembro de 2018
Ultima resposta 28 de nov. de 2018
Respostas 30
Participantes 4