Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 23250|Resposta: 11

[Nova Edição] Como escolher os quartos mais baratos

[Copiar link]
Publicado em 05/12/2018 21:32:38 | | | |
Agora há duas mesas para usar, room_type e room_info
Existem 3 hotéis com documentos de identidade 1~3. Depois, cada hotel tem 3 tipos de quartos, com IDs de 1~9, respectivamente.
O room_type contém o nome, ID e o correspondente ID do hotel de cada tipo de quarto
O que é armazenado no room_info é o preço de cada dia, cada tipo de quarto e o número de quartos restantes.
Os tópicos que gostaria de perguntar são:
Especifique o intervalo de tempo e o número de quartos a serem reservados, consulte os hotéis, as opções de tipos de quartos e seus preços médios que atendam às condições (horário, número de quartos restantes) e ordene por preço médio do menor ao mais alto. Os resultados incluem hotéis, combinações e quantidades selecionadas de quartos, além do menor preço médio.
##不要求为同一房型, mas deve ser o mesmo hotel, e você pode mudar o tipo de quarto no meio do caminho.
##比如, o horário de check-in é 2018-11-14~2018-11-15, e o número de quartos reservados é 5
##返回选择酒店A, 11-14 selecionam 4 tipos de quarto com ID 3, 1 tipo de quarto com ID 2, 11-15 selecionam 3 tipos de quarto com ID 3, 2 tipos de quarto com ID 2, e o preço mais baixo é 2000
##老师要求只能用sql语句, a implementação do MySQL não pode usar Python, C++, etc
Não escrevi isso por um dia, e não vi um assunto parecido na Internet, então vim pedir ajuda aos deuses, e quero perguntar como conseguir isso, obrigado~







Anterior:Compartilhamento de experiências auto-relatadas do macaco do programa PHP
Próximo:Pesquisa de Pós-Graduação Política Política de Xu Tao e Xiao Xiurong
Publicado em 06/12/2018 17:00:58 |
Este post foi editado pela última vez por Miaolinsen em 2018-12-6 às 17:03

Eu não fiz isso com o mysql, fiz com o mssql:


/*
Especifique o intervalo de tempo e o número de quartos a serem reservados, consulte os hotéis, as opções de tipos de quartos e seus preços médios que atendam às condições (horário, número de quartos restantes) e ordene por preço médio do menor ao mais alto. Os resultados incluem hotéis, combinações e quantidades selecionadas de quartos, além do menor preço médio.
##不要求为同一房型, mas deve ser o mesmo hotel, e você pode mudar o tipo de quarto no meio do caminho. -- Análise Sintática: Significa que não há necessidade de considerar o tipo de sala, apenas o número de salas é considerado
##比如, selecione o horário de check-in 2018-11-14~2018-11-15, e o número de quartos reservados é 5 -- Análise: O hotel precisa estar dentro do intervalo de datas, e há demanda pelo número de quartos todos os dias (se não houver ninguém em determinado dia, não atenderá ao padrão)
##返回选择酒店A, 11-14 selecionam 4 tipos de quarto com ID 3, 1 tipo de quarto com ID 2, 11-15 selecionam 3 tipos de quarto com ID 3, 2 tipos de quarto com ID 2, e o preço mais baixo é 2000 -- Análise: Calcule o preço médio de acordo com a configuração mínima por dia
##老师要求只能用sql语句, implementação mysql, não pode usar python, c++, etc. */


-- Parâmetros de entrada, faixa de datas, número de salas necessárias
DECLARAR @sdate DATA = '2018-11-14';
DECLARAR @edate DATA = '2018-11-15';
DECLARAR @roomnum INT = 5;


-- Calcule o número de dias de estadia
DECLARAR @days INT;
CONJUNTO @days = DATEDIFF(DIA, @sdate, @edate)+1;

-- Número do hotel que atende à faixa de datas, número de quartos
IF EXISTS(selecione * de tempdb.dbo.sysobjects onde id = object_id(N'tempdb.. ##temp_hotel') e tipo='U')
INÍCIO
    Tabela de Drop ##temp_hotel
FIM

SELECIONE ta.hotel_id em ##temp_hotel DE
(SELECT ri. [data], rt.hotel_id, SUM(ri.remain) room_num DE room_info ri JOIN ESQUERDA room_type rt em ri.room_id=rt.room_id onde @sdate <= [data] e [data] <= @edate GRUPO POR ri. [data],rt.hotel_id TENDO SOMA(RESTANTE) >= 5) TA
AGRUPE POR ta.hotel_id TENDO COUNT(*) = @days



-- Calculado de acordo com o hotel (configure o tipo mínimo de quarto por dia)

IF EXISTS(selecione * de tempdb.dbo.sysobjects onde id = object_id(N'tempdb.. ##temp_result') e tipo='U')
INÍCIO
    Tabela de Drop ##temp_result
FIM
-- Tabela Provisória de Resultados Hotel Date Date Tipo ID Quarto Nome do Quarto Número de Quartos Preço dos Quartos Hotel Diário Total Hotel Preço Médio Diário Hotel Hotel Total Preço Médio Diário Total Preço Médio do Hotel Total Preço Diário do Quarto
CRIAR TABELA ##temp_result(
    hotel_id INT,
    hotel_name Varchar (255),
    [data] DATA,
    room_id INT,
    room_name VARCHAR(255),
    room_num INT,
    preço do quarto DECIMAL,
    dsumprice DECIMAL,
    davgprice DECIMAL,
    sumpric DECIMAL,
    DECIMAL sumavgpric
)

DECLARE @hid INT; -- ID do hotel
DECLARAR @infoid INT; -- ID de informação
--afirmar que o cursor é uma coleção
DECLARE my_cursor cursor para (SELECT hotel_id de ##temp_hotel);
--Cursor aberto--
aberto my_cursor
--Variáveis do cursor do loop inicial--
Buscar o próximo de my_cursor para @hid
enquanto @@FETCH_STATUS = 0 -- retorna o estado do último cursor executado pela instrução FETCH --
INÍCIO      
    -- Com base no ID do hotel, a data recorrente é precificada
    IF EXISTS(selecione * de tempdb.dbo.sysobjects onde id = object_id(N'tempdb.. ##temp_room') e tipo='U')
    INÍCIO
        Drop Table ##temp_room
    FIM

    -- Hotéis, por data, com quartos organizados por data Tarifa
    SELECIONE info_id, [data], preço, remanescente room_id PARA ##temp_room DE dbo.room_info ONDE @sdate <= [data] e [data] <= @edate E permanecem > 0 E room_id EM (SELECIONAR rt.room_id DE dbo.room_type rt ONDE rt.hotel_id=@hid) PEDIDO POR [data] ASC, preço ASC
   
   
    DECLARE @thisrdate DATA = NULO; -- Data
    DECLARAR @thisrnum INT=0; -- Número de quartos selecionados na data atual
   
    DECLARE @rdate DATA = NULL; -- Data
    DECLARAR @rmnum INT = 0; -- Número de quartos por tipo de quarto
   
    -- Ciclo por data
    DECLARE @my_cursor2 CURSOR;
    definir @my_cursor2 = CURSOR PARA SELECIONAR info_id DE ##temp_room ORDEM POR [DATA] ASC, PREÇO ASC
    ABRIR @my_cursor2;
    BUSQUE O PRÓXIMO DE @my_cursor2 PARA @infoid
    WHILE(@@FETCH_STATUS=0)
    INÍCIO
        --##temp_result
        SELECT @rmnum=remain, @rdate=[date] DE ##temp_room ONDE info_id=@infoid
        SE (@thisrdate FOR NULO OU @thisrdate != @rdate)
        INÍCIO
            IMPRESSÃO @rdate
            CONJUNTO @thisrdate = @rdate;
            CONJUNTO @thisrnum = 0;
        FIM
        -- Tipo de sala de seleção da forma dosificatória
        SE(@thisrnum <= @roomnum)
        INÍCIO
            SE (@thisrnum + @rmnum > @roomnum)
            INÍCIO
                -- O número de quartos que você precisa usar
                CONJUNTO @rmnum = @roomnum-@thisrnum;
            FIM
        FIM
        CASO NÃO   
        INÍCIO
            -- Não é necessário espaço para essa data
            CONJUNTO @rmnum = 0;
        FIM
        
        SE (@rmnum > 0)
        INÍCIO
            -- Adicionar resultados pelo número especificado
            INSIRA EM ##temp_result(hotel_id, hotel_name, [data], room_id, room_name, room_num, preço do quarto, dsumprice, davgprice, sumpric, sumavgpric)
            SELECIONE @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0 A PARTIR DE ##temp_room ONDE info_id = @infoid
            
            -- O número de quartos atingiu o preço médio calculado
            CONJUNTO @thisrnum = @thisrnum + @rmnum;
            SE (@thisrnum = @roomnum)
            INÍCIO
                -- Preço total por hotel, calculado para datas
                ATUALIZAÇÃO ##temp_result DEFINIR dsumprice=(SELECT SUM(room_num*roomprice) DE ##temp_result TR ONDE tr.hotel_id=@hid E TR.[ data]=@thisrdate) ONDE hotel_id=@hid E [data]=@thisrdate
                -- Calcule a tarifa média do quarto por hotel, preço total por data
                ATUALIZAÇÃO ##temp_result DEFINIR davgprice=(dsumprice/@roomnum) ONDE hotel_id=@hid E [data]=@thisrdate
            FIM
        FIM

        BUSCAR EM SEGUIDA DE @my_cursor2 PARA @infoid;
    FIM   
    próximo @my_cursor2;  --Desligue o cursor
    desalocar @my_cursor2;   --liberar cursor

    -- Por hotel, calcule o preço total do hotel
    ATUALIZAÇÃO ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) DE ##temp_result TR ONDE tr.hotel_id=@hid) ONDE hotel_id=@hid
    -- Calcular o preço médio diário do total de quartos no hotel
    ATUALIZAÇÃO ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) ONDE hotel_id=@hid

    FETCH em seguida de my_cursor para @hid - vá para o próximo cursor, sem deadloops
FIM  
Fechar my_cursor — Fechar o cursor
desalocar my_cursor - liberar o cursor


-- Adicionar o nome do hotel e o nome do tipo de quarto à tabela temporária
ATUALIZAÇÃO ##temp_result SET hotel_name=(SELECT ht.hotel_name FROM dbo.hotel ht WHERE ht.hotel_id=##temp_result.hotel_id),
room_name=(SELECT rt.room_name FROM dbo.room_type rt WHERE rt.room_id=##temp_result.room_id)


-- Verifique os resultados da tabela de resultados
SELECIONAR * DE ##temp_result




-- Fim de limpeza das mesas temporárias
IF EXISTS(selecione * de tempdb.dbo.sysobjects onde id = object_id(N'tempdb.. ##temp_hotel') e tipo='U')
INÍCIO
    Tabela de Drop ##temp_hotel
FIM
IF EXISTS(selecione * de tempdb.dbo.sysobjects onde id = object_id(N'tempdb.. ##temp_room') e tipo='U')
INÍCIO
    Drop Table ##temp_room
FIM
IF EXISTS(selecione * de tempdb.dbo.sysobjects onde id = object_id(N'tempdb.. ##temp_result') e tipo='U')
INÍCIO
    Tabela de Drop ##temp_result
FIM

Pontuação

Número de participantes1MB+1 contribuir+1 Colapso razão
admin + 1 + 1 Entusiasmado em ajudar os outros!

Veja todas as classificações

 Senhorio| Publicado em 06/12/2018 14:11:48 |
xzxmustwin Postado em 2018-12-6 11:58
Para ser honesto, a estrutura dessa tabela é um pouco irracional

As questões de lição de casa atribuídas pelo professor do banco de dados do emmmm podem realmente ser irrazoáveis, e eu não vi se não tivesse aprendido muito bem...
No entanto, o segredo ainda são as ideias para resolver problemas, quero perguntar aos meus amigos se vocês têm alguma sugestão?
 Senhorio| Publicado em 06/12/2018 14:09:20 |
Lzzsf postado em 09:07 de 2018-12-09:07
MySQL está desatualizado, sem cliente, me passe o script para SQL Server

Desculpe, ainda não usei o SQL Server, talvez porque é só para ensinar, então o professor pediu para usarmos o MySQL para isso. Se seus amigos estiverem dispostos a compartilhar suas ideias, muito obrigado.
Publicado em 05/12/2018 21:57:13 |
Vou ao grupo QQ oferecer uma recompensa de 10 yuans para ver se alguém pode te ajudar a responder não
Publicado em 06/12/2018 07:56:39 |
Ajuda
Publicado em 06/12/2018 09:07:08 |
MySQL está desatualizado, sem cliente, me passe o script para SQL Server

Pontuação

Número de participantes1MB+1 contribuir+1 Colapso razão
admin + 1 + 1 Entusiasmado!

Veja todas as classificações

Publicado em 06/12/2018 11:24:25 |
Lzzsf postado em 09:07 de 2018-12-09:07
MySQL está desatualizado, sem cliente, me passe o script para SQL Server

É recomendado conversar sobre a ideia e deixar o proprietário usá-la como referência, o que também deve ser possível
Publicado em 06/12/2018 11:58:37 |
Para ser honesto, a estrutura dessa tabela é um pouco irracional

Pontuação

Número de participantes1MB+1 contribuir+1 Colapso razão
admin + 1 + 1 Entusiasmado!

Veja todas as classificações

 Senhorio| Publicado em 06/12/2018 14:07:29 |
Publicado em 2018-12-5 às 21:57
Vou ao grupo QQ oferecer uma recompensa de 10 yuans para ver se alguém pode te ajudar a responder não

Obrigado, se alguém quiser responder, eu envio o envelope vermelho :)
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com