【问题标题】:SQL Oracle/Aggregation querySQL Oracle/聚合查询
【发布时间】:2017-10-12 16:30:32
【问题描述】:

我正在尝试在 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.* 

这非常有效,但对于基于每周的帐户,所以与其提取最后三个已结算的每周金额,即 25-09-17、18-09-17、11-09-2017,我想要以提取 9 月、8 月和 7 月的总付款。

我希望这一切都有意义。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    使用内部查询的SELECTGROUP BY 以及PARTITIONPIVOT 子句中的EXTRACT(month ...) 将聚合从当前单位级别(即每周)更改为月级别:

    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.* 
    

    DEMO (随机数据)

    http://rextester.com/UJK84858

    【讨论】:

    • 我在Oracle中没有看到MONTH()函数,你在哪里找到的?
    • Oracle 数据库中没有 MONTH() 函数。您发布的链接适用于 JAVADB。我不需要尝试 EXTRACT(...),我知道它会起作用 - 这是在 Oracle 中执行此操作的正确方法。
    • 另外 - “我的”要测试的表是什么意思?我不是 OP。
    • @mathguy ...我添加了一个带有月份数字和名称的解决方案的 rextester 演示。
    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多