Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] CONSULTAS NO POSTGRESQL

Tenho duas tabelas de um banco de dados sobre reservas de quartos em um hotel e preciso saber como fazer essa consulta nelas:

Quantas reservas foram efetivadas e canceladas por ano? [Saída: Ano, Total Cancelado, Total Efetivado] Ex.: [2022 - 40 - 60] Os totais de cancelado e efetivado de cada ano na mesma linha

OBS: Existem apenas os anos de 2017 e 2018 no arquivo csv disponibilizado e campo 'RESERVA_ESTADO' da tabela 'tb_ESTADO' recebe apenas valores CANCELADO e EFETIVADO.

TABELA DE RESERVAS NO HOTEL

CREATE TABLE tb_RESERVAS(
    id VARCHAR(20) PRIMARY KEY NOT NULL,
    ADULTOS_QNT INT NOT NULL,
    CRIANCAS_QNT INT NOT NULL,
    DIAS_FIM_DE_SEMANA INT NOT NULL,
    QNT_DIAS_MEIO_SEMANA INT NOT NULL,
    COM_ESTACIONAMENTO VARCHAR(5) NOT NULL,
    TEMPO_DE_ESPERA INT NOT NULL,
    ANO CHAR(4) NOT NULL,
    MES INT NOT NULL,
    DIA INT NOT NULL,
    TIPO_RESERVA VARCHAR(20) NOT NULL,
    PRECO_QUARTO DECIMAL(10,2) NOT NULL,
    QNT_PEDIDOS_ESPECIAIS INT NOT NULL,
    ID_RESERVA_ESTADO SERIAL UNIQUE  
);

TABELA DE ESTADO DA RESERVA

CREATE TABLE tb_ESTADO(
    id SERIAL PRIMARY KEY REFERENCES tb_RESERVAS(ID_RESERVA_ESTADO),
    RESERVA_ESTADO VARCHAR(15) NOT NULL 
);
2 respostas
solução!

Olá Yan, como vai?

Você pode aprender como fazer essas consultas estudando nossa formação Conhecendo SQL.

Para solucionar esse problema, você pode utilizar o JOIN para combinar as informações das duas tabelas e, em seguida, agrupar os resultados por ano. Além disso, é necessário contar condicionalmente as reservas efetivadas e canceladas. Aqui está um exemplo:

SELECT 
    r.ANO,
    COUNT(CASE WHEN e.RESERVA_ESTADO = 'CANCELADO' THEN 1 END) AS Total_Cancelado,
    COUNT(CASE WHEN e.RESERVA_ESTADO = 'EFETIVADO' THEN 1 END) AS Total_Efetivado
FROM 
    tb_RESERVAS r
JOIN 
    tb_ESTADO e ON r.ID_RESERVA_ESTADO = e.id
GROUP BY 
    r.ANO
ORDER BY 
    r.ANO;

Nesta consulta:

  • JOIN tb_ESTADO e ON r.ID_RESERVA_ESTADO = e.id une as tabelas tb_RESERVAS e tb_ESTADO baseando-se no relacionamento entre ID_RESERVA_ESTADO e id.
  • COUNT(CASE WHEN e.RESERVA_ESTADO = 'CANCELADO' THEN 1 END) conta as reservas canceladas.
  • COUNT(CASE WHEN e.RESERVA_ESTADO = 'EFETIVADO' THEN 1 END) conta as reservas efetivadas.
  • GROUP BY r.ANO agrupa os resultados por ano.
  • ORDER BY r.ANO ordena os resultados por ano para uma melhor visualização.

Essa consulta deve fornecer a saída desejada com o ano, total de reservas canceladas e efetivadas para cada ano disponível no banco de dados. Lembre-se de substituir os nomes das tabelas e colunas conforme necessário para corresponder ao seu esquema de banco de dados exato.

Como é um caso particular, é necessário fazer os testes e ajustes necessários e o código fornecido pode não funcionar corretamente.

Espero ter ajudado.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Muito boa resposta!!