Esta publicación fue editada por última vez por Miaolinsen el 6-12-2018 a las 17:03
No lo hice con mysql, lo hice con mssql:
/* Especifica el rango de tiempo y el número de habitaciones a reservar, consulta los hoteles, las opciones de tipo de habitación y sus precios medios que cumplan las condiciones (hora, número de habitaciones restantes) y ordénalas por precio medio de menor a mayor. Los resultados incluyen hoteles, combinaciones y cantidades seleccionadas de habitaciones, y el precio medio más bajo. ##不要求为同一房型, pero debe ser el mismo hotel, y puedes cambiar el tipo de habitación a mitad de camino. -- Análisis sintáctico: Significa que no es necesario considerar el tipo de habitación, solo se considera el número de habitaciones ##比如, selecciona la hora de check-in 2018-11-14~2018-11-15, y el número de habitaciones reservadas es 5 -- Análisis: El hotel debe estar dentro del rango de fechas, y hay demanda de habitaciones cada día (si no hay nadie en un día determinado, no cumplirá el estándar) ##返回选择酒店A, 11-14 seleccionan 4 tipos de habitaciones con ID 3, 1 tipo de habitación con ID 2, 11-15 seleccionan 3 tipos de habitaciones con ID 3, 2 tipos de habitaciones con ID 2, y el precio más bajo es 2000 -- Análisis: Calcula el precio medio según la configuración mínima por día ##老师要求只能用sql语句, implementación de mysql, no puede usar python, c++, etc. */
-- Parámetros entrantes, rango de fechas, número de habitaciones requeridas DECLARAR @sdate FECHA = '2018-11-14'; DECLARAR @edate FECHA = '2018-11-15'; DECLARAR @roomnum INT = 5;
-- Calcular el número de días de estancia DECLARAR @days INT; CONJUNTO @days = DATEDIFF(DÍA, @sdate, @edate)+1;
-- Número de hotel que cumple con el rango de fechas, número de habitaciones IF EXISTS(select * from tempdb.dbo.sysobjects donde id = object_id(N'tempdb.. ##temp_hotel') y tipo='U') COMIENZO Tabla de caída ##temp_hotel FIN
SELECCIONA ta.hotel_id en ##temp_hotel DESDE (SELECT ri. [fecha], rt.hotel_id, SUM(ri.remain) room_num DESDE room_info ri UNIRSE a la izquierda room_type rt en ri.room_id=rt.room_id donde @sdate <= [fecha] y [fecha] <= @edate GRUPO POR ri. [fecha],rt.hotel_id TENIENDO SUMA (resto) >= 5) ta AGRUPA POR ta.hotel_id TENIENDO COUNT(*) = @days
-- Calculado según el hotel (configurar el tipo mínimo de habitación por día)
IF EXISTS(select * from tempdb.dbo.sysobjects donde id = object_id(N'tempdb.. ##temp_result') y tipo='U') COMIENZO Tabla de caída ##temp_result FIN -- Tabla provisional de resultados Hotel Cita Tipo de habitación ID Nombre de habitación Nombre de habitaciones Precio de habitación Hotel Total diario Hotel Total Precio medio diario de hotel Hotel Precio total de hotel Total precio diario de hotel Precio medio diario total de hotel CREAR TABLA ##temp_result( hotel_id INT, hotel_name varchar (255), [fecha] FECHA, room_id INT, room_name VARCHAR (255), room_num INT, precio de la habitación DECIMAL, dsumprice DECIMAL, davgprice DECIMAL, DECIMAL de sumprico, sumavgpric DECIMAL
)
DECLARAR @hid INT; -- ID del hotel DECLARAR @infoid INT; -- ID de la información --afirmar que el cursor es una colección DECLARE my_cursor cursor para (SELECT hotel_id de ##temp_hotel); --Cursor abierto-- Abre my_cursor --Variables de cursor del bucle inicial-- Busca el siguiente de my_cursor a @hid mientras que @@FETCH_STATUS = 0 -- devuelve el estado del último cursor ejecutado por la instrucción FETCH -- COMIENZO -- Según el ID del hotel, la fecha recurrente se valora IF EXISTS(select * from tempdb.dbo.sysobjects donde id = object_id(N'tempdb.. ##temp_room') y tipo='U') COMIENZO Tabla de caída ##temp_room FIN
-- Hoteles, por fecha, con habitaciones ordenadas por fecha Tarifa SELECCIONAR info_id, [fecha], precio, permanecer room_id EN ##temp_room DESDE dbo.room_info DONDE @sdate <= [fecha] y [fecha] <= @edate Y permanezcan > 0 Y room_id EN (SELECCIONAR rt.room_id DE dbo.room_type rt WHERE rt.hotel_id=@hid) PEDIDO POR [fecha] ASC, precio ASC
DECLARAR @thisrdate FECHA = NULO; -- Fecha DECLARAR @thisrnum INT=0; -- Número de habitaciones seleccionadas en la fecha actual
DECLARAR @rdate FECHA = NULO; -- Fecha DECLARAR @rmnum INT = 0; -- Número de habitaciones por tipo de habitación
-- Ciclar por fecha DECLARAR @my_cursor2 CURSOR; establecer @my_cursor2 = CURSOR PARA SELECT info_id DE ##temp_room ORDEN POR [FECHA] ASC, PRECIO ASC ABRIR @my_cursor2; BUSCA EL SIGUIENTE DE @my_cursor2 EN @infoid WHILE(@@FETCH_STATUS=0) COMIENZO --##temp_result SELECT @rmnum=remain, @rdate=[fecha] DESDE ##temp_room DONDE info_id=@infoid SI (@thisrdate ES NULO O @thisrdate != @rdate) COMIENZO IMPRESO @rdate CONJUNTO @thisrdate = @rdate; CONJUNTO @thisrnum = 0; FIN -- Tipo de sala de selección de forma dosificada SI(@thisrnum <= @roomnum) COMIENZO SI (@thisrnum + @rmnum > @roomnum) COMIENZO -- El número de habitaciones que necesitas usar CONJUNTO @rmnum = @roomnum-@thisrnum; FIN FIN SI NO COMIENZO -- No se requiere habitación para esa fecha CONJUNTO @rmnum = 0; FIN
SI (@rmnum > 0) COMIENZO -- Añadir resultados por número especificado INSERTAR EN ##temp_result(hotel_id, hotel_name, [fecha], room_id, room_name, room_num, precio de habitación, precio de habitación, precio de carga, precio de carga, precio de la habitación, precio de la habitación, sumavgpric) SELECCIONA @hid, '', @thisrdate, room_id, '', @rmnum, price, 0, 0, 0, 0 DESDE ##temp_room DONDE info_id = @infoid
-- El número de habitaciones ha alcanzado el precio medio calculado CONJUNTO @thisrnum = @thisrnum + @rmnum; SI (@thisrnum = @roomnum) COMIENZO -- Precio total por hotel, calculado por fechas ACTUALIZACIÓN ##temp_result ESTABLECER dsumprice=(SELECT SUM(room_num*roomprice) DESDE ##temp_result tr DONDE tr.hotel_id=@hid Y TR.[ fecha]=@thisrdate) DONDE hotel_id=@hid Y [fecha]=@thisrdate -- Calcular la tarifa media por hotel, precio total por fecha ACTUALIZACIÓN ##temp_result ESTABLECER davgprice=(dsumprice/@roomnum) DONDE hotel_id=@hid Y [fecha]=@thisrdate FIN FIN
A CONTINUACIÓN TRAER DE @my_cursor2 EN @infoid; FIN Cerca @my_cursor2; --Apaga el cursor desalocar @my_cursor2; --liberar cursor
-- Por hotel, calcula el precio total del hotel ACTUALIZACIÓN ##temp_result SET sumpric=(SELECT SUM(room_num*roomprice) DE ##temp_result TR DONDE tr.hotel_id=@hid) DONDE hotel_id=@hid -- Calcular el precio medio diario del total de habitaciones del hotel ACTUALIZACIÓN ##temp_result SET sumavgpric=(sumpric/@roomnum/@days) DONDE hotel_id=@hid
OBREPARA el siguiente de my_cursor a @hid - pasa al siguiente cursor, sin bucles muertos FIN Cerrar my_cursor — cerrar el cursor Deallocate my_cursor - liberar el cursor
-- Añadir el nombre del hotel y el nombre del tipo de habitación a la tabla temporal ACTUALIZACIÓN ##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)
-- Consulta los resultados de la tabla de resultados SELECCIONAR * DE ##temp_result
-- Fin de despejar mesas temporales IF EXISTS(select * from tempdb.dbo.sysobjects donde id = object_id(N'tempdb.. ##temp_hotel') y tipo='U') COMIENZO Tabla de caída ##temp_hotel FIN IF EXISTS(select * from tempdb.dbo.sysobjects donde id = object_id(N'tempdb.. ##temp_room') y tipo='U') COMIENZO Tabla de caída ##temp_room FIN IF EXISTS(select * from tempdb.dbo.sysobjects donde id = object_id(N'tempdb.. ##temp_result') y tipo='U') COMIENZO Tabla de caída ##temp_result FIN
|