如何获得我的数据集中每个月的最大/最小功能?

时间:2019-04-10 20:19:06

标签: sql oracle date subquery

我需要提供使用情况数据,并需要按月汇总。

在我的代码中,我仅查看2018年1月,因此根据当前数据集查找最大值和最小值非常简单。如果要在2018年全年进行扩展,我目前将显示全年的最大值和最小值。

      SELECT DISTINCT
         bi_vwn_co_acct,
         bi_consumer_view_1.bi_format_name,
         bi_srv_loc.bi_city,
         bi_srv_loc.bi_st,
         bi_srv_loc.bi_x_coord,
         bi_srv_loc.bi_y_coord,
         bi_interval_rdgs.bi_mtr_nbr,
         MAX (bi_interval_rdgs.bi_rdg),
         MIN (bi_interval_rdgs.bi_rdg),
         (MAX (bi_interval_rdgs.bi_rdg) - MIN (bi_interval_rdgs.bi_rdg))
            AS monthusage
    FROM bi_srv_loc
         INNER JOIN bi_srv_link
            ON bi_srv_loc.bi_srv_loc_nbr = bi_srv_link.bi_srv_loc_nbr
         INNER JOIN bi_type_service
            ON bi_srv_link.bi_srv_loc_nbr = bi_type_service.bi_srv_loc_nbr
         INNER JOIN bi_consumer_view_1
            ON bi_type_service.bi_acct = bi_consumer_view_1.bi_vwn_co_acct
         INNER JOIN bi_interval_rdgs
            ON bi_srv_link.bi_mtr_nbr = bi_interval_rdgs.bi_mtr_nbr
   WHERE     bi_interval_rdg_dt_tm >= '01-JAN-2018'
         AND bi_interval_rdg_dt_tm <= '31-JAN-2018'
         AND bi_type_service.bi_srv_stat_cd IN ('1',
                                                '7',
                                                '18',
                                                '21',
                                                '22',
                                                '30')
GROUP BY bi_consumer_view_1.bi_vwn_co_acct,
         bi_consumer_view_1.bi_format_name,
         bi_srv_loc.bi_x_coord,
         bi_srv_loc.bi_y_coord,
         bi_interval_rdgs.bi_mtr_nbr,
         bi_srv_loc.bi_city,
         bi_srv_loc.bi_st

我希望获得看起来像这样的数据列表:

ACCT1 JAN MONTHUSAGE: 10
ACCT1 FEB MONTHUSAGE: 13
ACCT1 MAR MONTHUSAGE: 12
...
ACCT2 JAN MONTHUSAGE: 23
ACCT2 FEB MONTHUSAGE: 18

我的代码中显然显示了更多字段,但总的来说,这就是我所追求的。我需要以某种方式能够遍历给定的日期范围并按月划分。任何帮助或指导将不胜感激!

2 个答案:

答案 0 :(得分:0)

将查询调整为GROUP BY MONTH(BI_INTERVAL_RDG_DT_TM), YEAR(BI_INTERVAL_RDG_DT_TM )

答案 1 :(得分:0)

我不确定我是否理解(所有这些列中的)哪一列代表数据值,所以-这是一个基于Scott的示例架构的示例,可能会为您提供想法-提取月份和年份信息(例如,通过使用TO_CHAR函数),并将其包含在GROUP BY子句中。

SQL> select to_char(e.hiredate, 'yyyymm') mon,
  2         min(e.sal) minsal,
  3         max(e.sal) maxsal
  4  from emp e
  5  group by to_char(e.hiredate, 'yyyymm')
  6  order by to_char(e.hiredate, 'yyyymm');

MON        MINSAL     MAXSAL
------ ---------- ----------
198012        800        800
198102       1250       1600
198104       2975       2975
198105       2850       2850
198106       2450       2450
198109       1250       1500
198111       5000       5000
198112        950       3000
198201       1300       1300
198212       3000       3000
198301       1100       1100

11 rows selected.

SQL>