2013-05-02 68 views
0

下面是我的表中的内容:表演上的某些行算术运算和显示结果

select * from summary_weekly_sales; 

DISTRIBUTOR DATE_OF_ACTIVATION NUMBER_OF_SALES 
-------------- ------------------ --------------- 
charan   25-APR-13    23 
charan   26-APR-13    2 
charan   28-APR-13    5 
charan   29-APR-13    50 
anil   25-APR-13    13 
anil   26-APR-13    4 
anil   28-APR-13    5 
anil   29-APR-13    30 

在利用iReport DATE_OF_ACTIVATION是输入参数(但在这里,我以date_of_activation为29-APR-13),我所要的输出显示如下:

DISTRIBUTOR avg_sales_week NUMBER_OF_SALES 
-------------- --------------- --------------- 
charan   10    50 

anil   7.33   30 

其中,

avg_sales_week是平均一周每个分销商的销售额7天背面29-APR-13)的

即用于查兰分配器平均=(5 + 2 + 23)/ 3

Number_Of_Sales在销售上29-APR-13

完成

我尝试使用oracle的wm_concat函数,但它没有按预期工作。

有什么办法可以得到上面的预期结果。

问候, 查兰

+0

我认为不可能一次完成这个请求,因为如果你有一个像DATE_OF_ACTIVATION = 29-APR-13这样的子句,你不能计算** anil **的平均销售额 – Nagasaki 2013-05-02 12:40:23

+0

,因为分销商平均值是(13 + 4 + 3)/ 3即10 – kattashri 2013-05-02 12:45:22

+0

看看Oracle分析函数 – OldProgrammer 2013-05-02 12:57:40

回答

2

这将做到这一点:

select distributor 
,  sum(case when date_of_activation < date '2013-04-29' 
      then number_of_sales end) 
    /count(distinct case when date_of_activation < date '2013-04-29' 
      then date_of_activation end) as avg_sales_week 
,  sum(case when date_of_activation=date '2013-04-29' 
      then number_of_sales end) number_of_sales 
from summary_weekly_sales 
where date_of_activation between date '2013-04-29' - 7 and date '2013-04-29' 
group by distributor; 

DISTRIBUTO AVG_SALES_WEEK NUMBER_OF_SALES 
---------- -------------- --------------- 
anil   7.33333333    30 
charan     10    50 

仅仅通过你的参数名称替换date '2013-04-29'例如p_date在程序中使用。

+0

我从来没有见过像这样的查询。 – kattashri 2013-05-02 13:57:09

+0

Hi @Tony,是否有可能在查询中获得average_sales_week和number_of_sales之间的绝对差异 – kattashri 2013-05-03 05:26:29

+0

@kattashri:不确定你的意思 - 你的意思是减去另一个?如果是这样的话,你可以将查询包装在另一个查询中,并将'select distribution,avg_sales_week,number_of_sales,number_of_sales-avg_sales_week与[(上面的查询)]区别开来' – 2013-05-03 09:09:03

0
select 
distributor, 
sum(number_of_sales)/
    (select count(*) from summary_weekly_sales sws2 where sws2.distributor = distributor and sws2.date_of_activation > '29-APR-13' - 7) 
as avg_sales_week, 
number_of_sales 
FROM summary_weekly_sales 
WHERE DATE_OF_ACTIVATION > '29-APR-13' - 7 
GROUP BY distributor 

也许这应该帮助。