51CTO技术论坛_中国领先的IT技术社区's Archiver

zzg123 发表于 2008-8-26 15:10

有个Oracle语句没看懂,帮帮忙呀

大家好,有一个句话没看明白,其中函数和字段的对应什么意思呀,麻烦给翻译一下。

SELECT last_name, hire_date, salary, SUM(salary) OVER (ORDER BY hire_date RANGE NUMTOYMINTERVAL(1,'') PRECEDING) AS t_sal FROM employees

zzg123 发表于 2008-8-26 16:30

谢谢了

水滴 发表于 2008-8-27 22:05

这个问题需要分解一下来回答:
1.
  numtoyminterval函数——数字转换函数
  语法:NUMTOYMINTERVAL ( n , 'char_expr' )
           char_expr:日期描述,可以是YEAR和MONTH;
  作用:可以将数字转换成相应的日期单位时间
  比如:NUMTOYMINTERVAL ( 1, 'MONTH' ) 表示一个月
           NUMTOYMINTERVAL ( 1, 'YEAR' ) 表示一年

    通常当我们使用add_month添加月时,如果输入是本月月底的日期,那么得到的也是月底的日期,比如add_month(to_date('2007-02-28','yyyy-mm-dd'),1)得到的就会是'2007-03-31',而不是'2007-03-28'。
    此时,如果使用的是to_date('2007-02-28','yyyy-mm-dd')+numtoyminterval(1,'month'),那么得到的就是'2007-03-28'。

2.
  SUM(salary) OVER (ORDER BY hire_date)——这是一个分析函数
  表示:按照hire_date字段的升序,对salary进行累加,如果只是SUM(salary),那么得到的每一行结果都是salary字段值的总和。

3.
  SUM(salary) OVER (ORDER BY hire_date RANGE NUMTOYMINTERVAL(1,'char_expr') PRECEDING)
  我想,你一定写掉了参数char_expr,此参数可以是YEAR或者MONTH!

  表示:按照hire_date的升序,累加一年(或者一个月)之内的salary。到了下一年(或月),重新开始累加。

  其他的就不用我解释了吧。

zzg123 发表于 2008-8-28 09:23

感谢水滴了!

水滴 发表于 2008-8-28 10:56

不客气

lixiaodan26 发表于 2008-8-29 11:38

学习了

erafio 发表于 2008-9-2 10:42

3楼8错

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.