【问题标题】:Merge rows into one row - Orcale 11g Database将行合并为一行 - Oracle 11g 数据库
【发布时间】:2022-01-14 23:05:33
【问题描述】:

我这里有这个 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

如您所见,问题是日期时间和一个酒店名称在表中重复

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

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)

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    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
    

    【讨论】:

    • 是的,谢谢,但是我必须如何更改语句才能在 GROUP BY 中使用 ROLLUP 或 CUBE
    • 为什么你认为你需要 ROLLUP 或 CUBE?你描述问题的方式,你所要做的就是 - 正如我所说 - 从 GROUP BY 子句中删除 NIGHTS。
    • 是否也可以将日期时间行合并为一行并将第一个用于数字作为行值
    • 对不起,我不明白你的意思。
    • 我想将 Datetime 列中的行合并为一行
    猜你喜欢
    • 2022-01-15
    • 2011-12-14
    • 1970-01-01
    • 2022-01-15
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多