打印每页销售数量不是总销售量

时间:2014-05-01 15:20:13

标签: javascript sql xml eclipse birt

所以Iam在封面上做了一个birt报告我的目标是在每页上输出给定人的销售额,而不是该人的总销售量

考虑这个表(考虑我们只有一个人):

    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行得到了第(0)页

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

  • 和第7-8行第2页

我也在使用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());
    }
     }

     }

1 个答案:

答案 0 :(得分:1)

一旦您的查询结果正确,您应该根据页面计算SUM(销售额)。 这可以使用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行/页)。这是一个puire 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)。