Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 23250|Respuesta: 11

[Nuevo número] Cómo elegir las habitaciones más baratas

[Copiar enlace]
Publicado en 5/12/2018 21:32:38 | | | |
Ahora hay dos tablas para usar, room_type y room_info
Hay 3 hoteles con DNI 1~3. Luego, cada hotel tiene 3 tipos de habitaciones, con IDs de 1~9 respectivamente.
El room_type contiene el nombre, el ID y el ID de hotel correspondiente de cada tipo de habitación
Lo que se almacena en el room_info es el precio de cada día, cada tipo de habitación y el número de habitaciones restantes.
Los temas que me gustaría plantear son:
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.
##比如, la hora de registro es 2018-11-14~2018-11-15, y el número de habitaciones reservadas es 5
##返回选择酒店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
##老师要求只能用sql语句, la implementación de MySQL no puede usar Python, C++, etc
No lo escribí durante un día, y no vi un tema similar en Internet, así que vine a pedir ayuda a los dioses, y quiero preguntarte cómo lograrlo, gracias~







Anterior:El intercambio de experiencias auto-reportadas por simios del programa PHP
Próximo:Política del examen de acceso de posgrado 2019 Materiales de sprint de Xu Tao y Xiao Xiurong
Publicado en 6/12/2018 17:00:58 |
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

Puntuación

Número de participantes1MB+1 contribuir+1 Colapso razón
Admin + 1 + 1 ¡Entusiasta de ayudar a los demás!

Ver todas las valoraciones

 Propietario| Publicado en 6/12/2018 14:11:48 |
xzxmustwin Publicado el 6-12-2018 11:58
Para ser sincero, la estructura de esta tabla es un poco irrazonable

Las preguntas de deberes que asigna el profesor de la base de datos de emmmm pueden ser realmente poco razonables, y no las vi si no las aprendí bien...
Sin embargo, la clave siguen siendo las ideas para resolver problemas, quiero preguntar a mis amigos si tenéis alguna sugerencia.
 Propietario| Publicado en 6/12/2018 14:09:20 |
lzzsf publicado el 6-12-2018 09:07
MySQL está desactualizado, no hay cliente, dame el script de SQL Server

Perdona, aún no he usado SQL Server, quizá porque solo es para enseñar, así que el profesor nos pidió que usáramos mysql para hacerlo. Si tus amigos están dispuestos a compartir sus ideas, muchas gracias.
Publicado en 5/12/2018 21:57:13 |
Iré al grupo QQ para ofrecerte una recompensa de 10 yuanes a ver si alguien puede ayudarte a responder que no
Publicado en 6/12/2018 7:56:39 |
Ayuda
Publicado en 6/12/2018 9:07:08 |
MySQL está desactualizado, no hay cliente, dame el script de SQL Server

Puntuación

Número de participantes1MB+1 contribuir+1 Colapso razón
Admin + 1 + 1 ¡Entusiasta!

Ver todas las valoraciones

Publicado en 6/12/2018 11:24:25 |
lzzsf publicado el 6-12-2018 09:07
MySQL está desactualizado, no hay cliente, dame el script de SQL Server

Se recomienda hablar sobre la idea y dejar que el casero la utilice como referencia, lo cual también debería ser posible
Publicado en 6/12/2018 11:58:37 |
Para ser sincero, la estructura de esta tabla es un poco irrazonable

Puntuación

Número de participantes1MB+1 contribuir+1 Colapso razón
Admin + 1 + 1 ¡Entusiasta!

Ver todas las valoraciones

 Propietario| Publicado en 6/12/2018 14:07:29 |
Publicado el 5-12-2018 a las 21:57
Iré al grupo QQ para ofrecerte una recompensa de 10 yuanes a ver si alguien puede ayudarte a responder que no

Gracias, si alguien está dispuesto a responder, le enviaré el sobre rojo :)
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com