用于月度报告的Oracle SQL查询

时间:2011-01-04 13:28:02

标签: sql oracle

伙计们我有一个名为 A 的表,其列为

-----
  A
-----
S_DATE
DUR
VIEWS
AMOUNT

表格A 中的数据包含以下 DateWise 行。

20101023  12 1   10000.0 
20101101  2  4   200.0
20101114  4  5   -9
20101201  6  10  150.0 
20101219  1  12  130.0 

我的要求是我想写一个按月 * 报告 *的SQL查询。例如,从webGUI,当我选择月份下拉列表为 DEC 并选择年份为 2010 。我需要创建显示DUR,VIEWS和AMOUNT的总和,从2010年11月1日到2010年12月1日。想知道怎么做。

DEC2010的结果应如下所示

**DEC2010 12 19 341**

1 个答案:

答案 0 :(得分:3)

这样可行(虽然当然由于您的要求,11月的第一天将在11月和12月的月度报告中出现?!):

SQL> VARIABLE p_months VARCHAR2(3);
SQL> VARIABLE p_year NUMBER;
SQL> EXEC :p_months := 'DEC'; :p_year := 2010;

PL/SQL procedure successfully completed.

SQL> WITH tableA AS (
  2  SELECT DATE '2010-10-23's_date , 12 dur, 1 views, 10000.0 amount FROM DUAL
  3  UNION ALL SELECT DATE '2010-11-01',  2,  4 ,  200.0 FROM DUAL
  4  UNION ALL SELECT DATE '2010-11-14',  4,  5 ,  -9    FROM DUAL
  5  UNION ALL SELECT DATE '2010-12-01',  6,  10,  150.0 FROM DUAL
  6  UNION ALL SELECT DATE '2010-12-19',  1,  12,  130.0 FROM DUAL
  7  )
  8  SELECT :p_months||:p_year month,
  9         SUM(dur),
 10         SUM(views),
 11         SUM(amount)
 12    FROM tableA
 13   WHERE s_date >= add_months(to_date(:p_months||:p_year, 'MONYYYY'), -1)
 14     AND s_date < to_date(:p_months||:p_year, 'MONYYYY') + 1;

MONTH        SUM(DUR) SUM(VIEWS) SUM(AMOUNT)
---------- ---------- ---------- -----------
DEC2010            12         19         341