将行合并为一行 - 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
我这里有这个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