Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Essa consulta gera distorção nos resultados?

A resposta correta para a pergunta: "Como você criaria uma consulta SQL para calcular a taxa de ocupação combinada com o preço médio diário de aluguel para cada proprietário, utilizando as tabelas proprietarios, hospedagens, alugueis e enderecos?" foi a seguinte:

SELECT p.nome AS proprietario, ROUND(AVG(a.preco_total / DATEDIFF(a.data_fim, a.data_inicio)), 2) AS preco_medio_diario, ROUND((SUM(DATEDIFF(a.data_fim, a.data_inicio)) / (DATEDIFF(MAX(a.data_fim), MIN(a.data_inicio)) ***** COUNT(DISTINCT h.hospedagem_id****))) * 100, 2) AS taxa_ocupacao FROM proprietarios p JOIN hospedagens h ON p.proprietario_id = h.proprietario_id JOIN alugueis a ON h.hospedagem_id = a.hospedagem_id GROUP BY p.proprietario_id;

Sendo que, onde deixei em negrito, na taxa de ocupação, creio que trazemos uma métrica que pode estar totalmente discrepante da realidade e gostaria da opinião de vocês para ver se eu não estou delirando rsrs

Da forma com que está disposta a lógica, creio que quando um proprietário tiver dois imóveis que começaram a ter seus aluguéis realizados em datas muito diferentes, por exemplo, um começou em 2021 e outro em 2024, a taxa média de ocupação será totalmente distorcida, visto que estamos multiplicando o total de dias da que começou em 2021 por 2. 

Não sei se ficou fácil de entender, mas gostaria da opinião de mais alguém. O GPT valida minha percepção, mas queria ter outra visão.
1 resposta
solução!

Olá, Artur! Tudo bem?

Você não está delirando haha. Como você mencionou, a fórmula utilizada para calcular a taxa de ocupação está considerando o total de dias desde a primeira data de aluguel até a última data de aluguel, independentemente do número de imóveis. Isso significa que, se um proprietário tem dois imóveis, um alugado desde 2021 e outro desde 2024, a taxa de ocupação será calculada como se os dois imóveis estivessem disponíveis desde 2021.

Para resolver esse problema, a taxa de ocupação deve ser calculada para cada imóvel separadamente e depois, sim, fazer a média ponderada para obter a taxa de ocupação do proprietário. Assim, uma possível solução seria utilizar uma subconsulta para calcular a taxa de ocupação de cada imóvel e depois fazer a média ponderada pela quantidade de dias que cada imóvel ficou disponível.

Vou deixar logo abaixo um exemplo de como a consulta poderia ser:

SELECT 
    p.nome AS proprietario,
    ROUND(AVG(a.preco_total / DATEDIFF(a.data_fim, a.data_inicio)), 2) AS preco_medio_diario,
    ROUND(SUM(dias_ocupados) / SUM(total_dias) * 100, 2) AS taxa_ocupacao
FROM 
    proprietarios p
JOIN 
    hospedagens h ON p.proprietario_id = h.proprietario_id
JOIN 
    alugueis a ON h.hospedagem_id = a.hospedagem_id
JOIN (
    SELECT 
        h.hospedagem_id,
        SUM(DATEDIFF(a.data_fim, a.data_inicio)) AS dias_ocupados,
        DATEDIFF(MAX(a.data_fim), MIN(a.data_inicio)) AS total_dias
    FROM 
        hospedagens h
    JOIN 
        alugueis a ON h.hospedagem_id = a.hospedagem_id
    GROUP BY 
        h.hospedagem_id
) AS tabela_ocupacao ON h.hospedagem_id = tabela_ocupacao.hospedagem_id
GROUP BY 
    p.proprietario_id;

Obrigada por compartilhar a sua reflexão sobre essa questão aqui no Fórum!

Desejo sucesso! Continue firme nos estudos! ✨✨

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