es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Combinar filas en una sola fila – Base de datos Oracle 11g

Tengo esta declaración SQL aquí:

SELECT DATETIME, DWH_ACCOMODATIONS.NAME, SUM(NIGHTS) 
FROM dwh_data JOIN DWH_ACCOMODATIONS ON dwh_data.fk_accomodation = DWH_ACCOMODATIONS.CODE 
WHERE dwh_data.fk_accomodation = 998 AND DATETIME BETWEEN 201001 AND 201012
GROUP BY DWH_ACCOMODATIONS.NAME, DATETIME, NIGHTS;

Esta declaración me da el siguiente resultado:

DATETIME         NAME             SUM(NIGHTS)
--------------   --------------   --------------   
201011           Hotel 1<998>     12689
201012           Hotel 1<998>     18495
201012           Hotel 1<998>     4958
201012           Hotel 1<998>     37580
201011           Hotel 1<998>     85938
201011           Hotel 1<998>     27488
201011           Hotel 1<998>     9874

El problema, como puedes ver, es que la fecha y el nombre de un hotel están duplicados en la tabla.

Ahora me gustaría obtener un resultado como este:

DATETIME         NAME             SUM(NIGHTS)
--------------   --------------   --------------   
201011           Hotel 1<998>     1268949
201012           Hotel 1<998>     1869859

Seguro que las noches también deben ser sumadas.

Ya lo intenté con esto en el GROUP BY:

GROUP BY ROLLUP(DWH_ACCOMODATIONS.NAME), ROLLUP(DATETIME), ROLLUP(NIGHTS)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en SQL y Oracle11g, me gustaría sugerir una modificación en la declaración SQL para obtener el resultado deseado.

    En lugar de usar funciones ROLLUP en la cláusula GROUP BY, simplemente podemos eliminar la columna NIGHTS de la cláusula GROUP BY y usar SUM(NIGHTS) en la cláusula SELECT como se muestra a continuación:

    SELECT DATETIME, DWH_ACCOMODATIONS.NAME, SUM(NIGHTS) 
    FROM dwh_data JOIN DWH_ACCOMODATIONS ON dwh_data.fk_accomodation = DWH_ACCOMODATIONS.CODE 
    WHERE dwh_data.fk_accomodation = 998 AND DATETIME BETWEEN 201001 AND 201012
    GROUP BY DWH_ACCOMODATIONS.NAME, DATETIME;
    

    Esta declaración SQL modificada nos dará el resultado deseado:

    DATETIME         NAME             SUM(NIGHTS)
    --------------   --------------   --------------   
    201011           Hotel 1<998>      1268949
    201012           Hotel 1<998>      1869859
    

    Espero que esto ayude. Avísame si tienes alguna pregunta adicional.

Comments are closed.