如果此值等于上一行的值,则SQL查询将行中的值替换为NULL

时间:2013-04-02 20:59:32

标签: sql oracle11g

我有以下sql查询:

选择供应商,名称,日期,营业额  来自营业额  供应商订购

  supplier      name        date       turnover
  --------      ---------   ---------- ----------
       001      supplier1   01.01.2012     129,67
       001      supplier1   02.05.2012  12.145,89
       001      supplier1   03.07.2012   6.830,90 
       002      supplier2   01.01.2012     -11,55
       002      supplier2   03.09.2012   4.500,61

是否可以用NULL替换重复值,因此生成的表看起来像这样(见下文)?

  supplier      name        date       turnover
  --------      ---------   ---------- ----------
       001      supplier1   01.01.2012     129,67
                            02.05.2012  12.145,89
                            03.07.2012   6.830,90 
       002      supplier2   01.01.2012     -11,55
                            03.09.2012   4.500,61

任何建议都将不胜感激!

2 个答案:

答案 0 :(得分:1)

您可以使用row_number

select case row when 1 then supplier_orig else null end as supplier,
  case row when 1 then name_orig else null end as name,
  date, turnover
from (
  select supplier AS supplier_orig, name AS name_orig, date, turnover,
  row_number() over (partition by supplier order by date) as row
  from turnover 
)
order by supplier_orig, date

SQL Fiddle here

答案 1 :(得分:0)

您可以使用分析函数LAGNULLIF函数。像

这样的东西
SQL> ed
Wrote file afiedt.buf

  1  select nullif(deptno,
  2                lag(deptno) over (order by deptno, ename)) formatted_deptno,
  3         ename
  4    from emp
  5*  order by deptno, ename
SQL> /

FORMATTED_DEPTNO ENAME
---------------- ----------
              10 CLARK
                 KING
                 MILLER
              20 ADAMS
                 FORD
                 JONES
                 SCOTT
                 SMITH
              30 ALLEN
                 BLAKE
                 JAMES
                 MARTIN
                 TURNER
                 WARD

14 rows selected.