将行合并为一行 - Oracle 11g 数据库

Merge rows into one row - Orcale 11g Database

我这里有这个SQL声明:

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;

这个语句给了我这个结果:

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

如您所见,问题是 table

中的日期时间和一个酒店名称重复

现在我想得到这样的结果:

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

当然也应该总结夜晚。

我已经在 GROUP BY 中用这个试过了:

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

GROUP BY是错误的;您应该从中删除 NIGHTS

  SELECT DATETIME, DWH_ACCOMODATIONS.NAME, SUM (NIGHTS) 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

如果要“合并”datetime 个值,请使用 listagg 函数:

  SELECT LISTAGG (datetime, ', ') WITHIN GROUP (ORDER BY datetime)
            AS datetimes,
         dwh_accomodations.name,
         SUM (nights)
            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