2014-05-01 98 views
0

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

考虑这个表(考虑我们只有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行了(0)

  • 但排4-5-6-7拿到第1页这是不对的,应该已经排4-5-6页1

  • 和行7-8页2

我也是使用JavaScript处理日食

 <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()); 
    } 
    } 

    } 
+0

您可以扩展为什么不利用本机“分页间隔”属性来处理每页的项目数? – Dominique

回答

1

一旦您的查询结果正确,您应该根据页面计算SUM(销售额)。 这是可以做到无论是用SQL(甲骨文的SQL语法)

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

或BIRT,如果你创建一个群组中的(布局)表(称为“页”为例),以及聚合列基于结合在这个组上。

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

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

我经常使用这样的“在SQL矩阵报告”等等(asssuming你想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)。