【问题标题】:Oracle query for the attached output附加输出的 Oracle 查询
【发布时间】:2018-03-10 08:18:07
【问题描述】:

我有一个场景,我需要显示每日交易以及该月的总交易以及日期和其他字段,如类型、产品等。 一旦我有了这个,主要的要求就是获得那个月的每日百分比,下面是一个例子。 1 月 1 日有 3 笔交易,1 月总共有 257 笔交易,1 月 1 日的百分比为 (3/257)*100,同样 10 月 2 日,百分比为 (10/257),依此类推。 谁能帮我查询一下sql?

Date    Type    Transaction Total_For_month Percentage
1/1/2017    A   3   257 1%
1/2/2017    B   10  257 4%
1/3/2017    A   5   257 2%
1/4/2017    C   8   257 3%
1/5/2017    D   12  257 5%
1/6/2017    D   17  257 7%

【问题讨论】:

  • 那么,报告是针对一个月的数据吗?或者您是否需要全年(例如)的报告,其中每天分别报告月份的总数和百分比?

标签: sql oracle


【解决方案1】:

使用窗口函数:

select t.*,
       sum(transaction) over (partition by to_char(date, 'YYYY-MM')) as total_for_month,
       transaction / sum(transaction) over (partition by to_char(date, 'YYYY-MM')) as ratio
from t;
【解决方案2】:

DATE 和 TYPE 是 Oracle 关键字,我希望您不要直接将它们用作列名。下面我将使用DT和TP。

您没有说任何一种方式,但您似乎必须过滤您的数据,以便最终报告是一个月(而不是一整年,比如说)。如果是这样,你可以做这样的事情。注意解析函数RATIO_TO_REPORT。请注意,我将比率乘以 100,并使用一些非标准格式来获得“百分比”格式的结果;如果您在第一次阅读时不理解该部分,请不要太担心。

select   dt, tp, transaction, sum(transaction) over () as total_trans_for_month,
         to_char(100 * ratio_to_report(transaction) over (), '90.0L', 
                                               'nls_currency=%') as pct_of_monthly_trans
from     your_table
where    dt >= date '2017-01-01' and dt < add_months(date '2017-01-01', 1)
order by dt   --  if needed (add more criteria as appropriate).

注意解析子句:over ()。我们没有按任何东西进行分区,也没有按任何东西排序;但是由于我们希望每一行输入在输出中生成一行,我们仍然需要 sum 的 analytic 版本,以及解析函数 ratio_to_report。实现此目的的正确方法是包含 over 子句,但将其留空:over ()

还要注意,在where 子句中,我没有将dt 包装在truncto_char 或任何其他函数中。如果幸运的话,该列上有一个索引,并且像我一样编写where 条件允许使用该索引,如果优化器发现它应该是的话。

日期“2017-01-01”是任意的(选择与您的示例相匹配);在生产中它可能应该是一个绑定变量。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多