打印每页的销售额而不是总销售额

printing quantity of sales per page not overall quantity of sales

本文关键字:销售额 打印      更新时间:2023-09-26

所以我正在制作一份关于enclipse的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次销售(我不想要(

我想要的是:

  • 在第一页上显示了30次销售(3行(

  • 在第二页上显示了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());
    }
     }
     }

查询结果正确后,应根据页面计算SUM(销售额(。这可以通过SQL(Oracle SQL语法(来完成

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

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

现在转到查询本身:我不认为DB实际上显示了您在查询中声明的结果。可能"行"在您的查询中被定义为

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(。