SQL Oracle/聚合查询

SQL Oracle/聚合查询,sql,oracle,Sql,Oracle,我正试图在Oracle上运行一个查询。我有一个账户的已结算付款表,我有一个查询,可以查询最后三个已结算金额,加上我需要这些信息的任何账户的任何已注销金额 然而,一些账户是以每周为基础的,对于这些账户,我想将它们的每周结算汇总到它们的每月组中。以下是我目前掌握的代码: SELECT * FROM ( SELECT * FROM ( SELECT gwod.account_id, gwod.char

我正试图在Oracle上运行一个查询。我有一个账户的已结算付款表,我有一个查询,可以查询最后三个已结算金额,加上我需要这些信息的任何账户的任何已注销金额

然而,一些账户是以每周为基础的,对于这些账户,我想将它们的每周结算汇总到它们的每月组中。以下是我目前掌握的代码:

SELECT   *
FROM     (
    SELECT *
    FROM   (
            SELECT   gwod.account_id,
                     gwod.charge_period_start,
                     SUM(gwod.total_due_on_charge) total_due_on_charge,
                     SUM(gwod.amount_written_off) amount_written_off,
                     DENSE_RANK() over (PARTITION BY gwod.account_id 
                                        ORDER BY charge_period_start DESC) rownumber
            FROM     report.accounts_write_off gwod
            WHERE    account_id IN (‘account_number’)
            GROUP BY gwod.account_id,
                     gwod.charge_period_start
            HAVING   SUM (gwod.total_due_on_charge) <> 0) t1
    WHERE  t1.rownumber <=3) 
    PIVOT (MAX(charge_period_start) charge_period, 
           MAX(total_due_on_charge) total_due_on_charge, 
           MAX(amount_written_off) amount_written_off 
           FOR rownumber IN (1,2,3))
ORDER BY account_id.* 
这一点非常有效,但对于每周结算的账户而言,因此,我希望完成9月、8月和7月的合计付款,而不是完成已结算的最后三个每周金额,即2017年9月25日、2017年9月18日、2017年9月11日


我希望所有这些都有意义。

只需使用内部查询中的SELECT和GROUP BY以及PARTITION和PIVOT子句将聚合从当前单位级别(即每周级别)更改为月份级别:

随机数据演示:


我在Oracle中没有看到月函数,您在哪里找到的?Oracle数据库中没有月函数。您发布的链接是针对JAVADB的。我不需要尝试提取…,我知道它会起作用-这是在Oracle中进行提取的正确方法。还有-我要测试的表是什么意思?我不是OP@mathguy。。。我添加了一个带有月号和名称的解决方案演示。
SELECT   *
FROM     (
    SELECT *
    FROM   (
            SELECT   gwod.account_id,
                     EXTRACT(month FROM gwod.charge_period_start) charge_period_month,
                     SUM(gwod.total_due_on_charge) total_due_on_charge,
                     SUM(gwod.amount_written_off) amount_written_off,
                     DENSE_RANK() over (PARTITION BY gwod.account_id 
                                        ORDER BY EXTRACT(month FROM gwod.charge_period_start) DESC) rownumber
            FROM     report.accounts_write_off gwod
            WHERE    account_id IN ('account_number')
            GROUP BY gwod.account_id,
                     EXTRACT(month FROM gwod.charge_period_start)
            HAVING   SUM (gwod.total_due_on_charge) <> 0) t1
    WHERE  t1.rownumber <=3) 
    PIVOT (MAX(charge_period_month) charge_period, 
           MAX(total_due_on_charge) total_due_on_charge, 
           MAX(amount_written_off) amount_written_off 
           FOR rownumber IN (1,2,3))
ORDER BY account_id.*