所以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
每个页面上的方案:
我想要的是:
在第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());
}
}
}
答案 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)。