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
|