提取一个月的总天数,然后使用它来获得每天的平均销售额

时间:2014-10-09 03:38:12

标签: sql oracle oracle11g report

嗨,我一直在研究这个项目,需要得到这个。

SELECT  sf.ORDER_QNT, dd.ACTUAL_DATE, dd.MONTH_NUMBER 
FROM    sales_fact sf,
        date_dim dd
WHERE   dd.date_id = sf.date_id
AND dd.MONTH_NUMBER = 1;

结果如下:

 ORDER_QNT ACTUAL_DATE MONTH_NUMBER
---------- ----------- ------------
      1100    05/01/13            1 
       100    05/01/13            1 
       140    06/01/13            1 
       110    07/01/13            1 
       200    08/01/13            1 
       500    08/01/13            1 
       230    08/01/13            1 
       500    08/01/13            1 
       200    08/01/13            1 
        53    15/01/13            1 
        53    22/01/13            1 

现在,我想获得该月的平均值(平均每天)。

SELECT  sum(sf.ORDER_QNT)/31 as AVGPERDAY
FROM    sales_fact sf,
        date_dim dd
WHERE   dd.date_id = sf.date_id
AND     dd.MONTH_NUMBER = 1;

问题是,如何才能获得31个月的总日期?以及如何将其应用于SELECT查询。我对逻辑(c ++)非常好,但这个数据库对我来说还是个新手。顺便说一句,我正在使用Oracle 11g。感谢您的任何帮助。

1 个答案:

答案 0 :(得分:0)

  

问题是,如何才能获得31个月的总日期?

选择任何一种解决方案:

1。 您可以将一个月添加到日期并减去两个日期:

ADD_MONTHS(date_col, 1) - date_col

示例:

SQL> WITH dates AS(
  2  SELECT to_date('05/01/13','mm/dd/rr') dt FROM dual UNION ALL
  3  SELECT to_date('06/01/13','mm/dd/rr') dt FROM dual UNION ALL
  4  SELECT to_date('02/01/13','mm/dd/rr') dt FROM dual)
  5  SELECT ADD_MONTHS(dt, 1) - dt num_of_days_per_month
  6  from dates
  7  /

NUM_OF_DAYS_PER_MONTH
---------------------
                   31
                   30
                   28

或者,

  1. 您可以提取当月的最后一天:
  2. EXTRACT(DAY FROM LAST_DAY (date_col))

    示例:

    SQL> WITH dates AS(
      2  SELECT to_date('05/01/13','mm/dd/rr') dt FROM dual UNION ALL
      3  SELECT to_date('06/01/13','mm/dd/rr') dt FROM dual UNION ALL
      4  SELECT to_date('02/01/13','mm/dd/rr') dt FROM dual)
      5  SELECT EXTRACT(DAY FROM LAST_DAY(dt)) num_of_days_per_month
      6  from dates
      7  /
    
    NUM_OF_DAYS_PER_MONTH
    ---------------------
                       31
                       30
                       28