【问题标题】:printing quantity of sales per page not overall quantity of sales打印每页的销售额而不是总销售额
【发布时间】:2014-05-01 15:20:12
【问题描述】:

所以我正在制作一份关于 enclipse 的 birt 报告我的目标是在每个页面上输出特定人的销售额,而不是该人的总销售额

考虑这张桌子(假设我们只有 1 个人):

    personID   sales   date
    -------    -----  -----
    111        10     2010-02-02
    111        15     2010-02-03
    111        5      2010-03-03
    111        7      2010-04-03
    111        8      2011-01-01
    111        9      2013-01-01
    111        20     2014-01-01
    111        25     2014-03-02

每一页的场景:

  • 它显示 3 个结果(我想要的)
  • 但在每个页面下方显示 99 次销售(我不想要)

我想要的是:

  • 在第 1 页显示 30 笔销售(3 行)

  • 在第 2 页显示 24 笔销售(3 行)

  • 最后一页显示 45(剩余 2 行)

我所做的是(我不知道它是否正确):

    DENSE_RANK() OVER (ORDER BY sales) AS Row,
convert(integer,ROW_NUMBER() over(order by sales)/4) as page

把我的桌子变成了

     personID   sales   date      Row     page
    -------    -----  -----       ----    ----
    111        10     2010-02-02   1       0
    111        15     2010-02-03   2       0
    111        5      2010-03-03   3       0
    111        7      2010-04-03   4       1
    111        8      2011-01-01   5       1
    111        9      2013-01-01   6       1
    111        20     2014-01-01   7       1
    111        25     2014-03-02   8       2

如您所见,还有一个问题是:

  • 前 3 行获得 page(0)

  • 但是第 4-5-6-7 行得到了第 1 页,这是错误的,它应该是第 4-5-6 行第 1 页

  • 和第 2 页第 7-8 行

我也在使用 JavaScript 开发 eclipse

       <method name="onPageEnd"><![CDATA[var sales = this.getInstancesByElementName("sales");
    var tmp=0;

    if( sales != null )
    {
     for(var i=0; i< sales.length; i++ )
     {
    for(var j=0;j<3;j++)
    {
        //Instance of DataItemInstance
        var sales = sales[i];
        tmp+=parseInt(sales.getValue());
    }
     }

     }

【问题讨论】:

  • 您能否详细说明为什么不使用本机“分页间隔”属性来处理每页的项目数?

标签: javascript sql xml eclipse birt


【解决方案1】:

一旦您的查询结果正确,您应该根据页面计算 SUM(sales)。 这可以通过 SQL(Oracle SQL 语法)来完成

with x as
(
  your_query_here
)
select x.*,
       sum(sales) over (partition by page) -- IIRC
from x

或使用 BIRT,如果您在(布局)表中创建一个 GROUP(例如称为“页面”),并基于该组绑定一个聚合列。

现在到查询本身: 我不认为数据库实际上显示了您在查询中陈述的结果。 可能“行”在您的查询中定义为

DENSE_RANK() OVER (ORDER BY "date" AS "Row"

我经常将这样的东西用于“SQL 中的矩阵报告”等(假设您想要 3 行/页)。这是一个纯粹的 SQL 解决方案:

with 
y as (
    select ...,
    ROW_NUMBER() over(order by "sales") partition by ("personID") - 1 as "Row" 
    -- Note: Row is zero-based: 0,1,2,...
),
x as (
    select y.*,
           MOD(y."Row", 3)  + 1  as "RowOnPage"
           trunc(y."Row"/3) + 1  as "Page"
    from y
)
select x.*,
       sum("sales") over (partition by "personId", "Page") as SumSalesPerPersonAndPage
       -- IIRC
from x

这可能不太正确(因为我不知道你打算如何处理不同的人),但你明白了......

对于创建报告,了解分析函数是一个很大的优势。

我通常在 BIRT 之外测试我的查询(例如使用 SQL*Developer)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    相关资源
    最近更新 更多