PLSQL 游标输出的重复行中为空

null in repeated rows of PLSQL cursor output

我很难解释我的问题。我做了一个 PLSQL 过程,它通过一个简单的查询从多个表中获取数据,然后将输出发送到一个游标,然后将结果输出为 xml,最后打印如下 [=26] =]

enter image description here

我想要的是将 null 放入红色矩形下方的值中,因为它们具有与它们之前的行相同的 "FATTURA" 名称,而不是一遍又一遍地重复相同的字段,只留下最后一个字段这总是不同的。我该怎么做?如果有人想看一下,我也可以把程序放上去

为了更好地解释,我有这个:

values(10002,'MANSANI, Luigi',to_date('01.12.2008','dd.mm.yyyy'), 23.22); 
values(10002,'MANSANI, Luigi',to_date('01.12.2008','dd.mm.yyyy'), 18.22);
values(10002,'MANSANI, Luigi',to_date('01.12.2008','dd.mm.yyyy'), 12.23);
values(10002,'MANSANI, Luigi',to_date('01.12.2008','dd.mm.yyyy'), 14.50);
values(10004,'MANSANI, Luigi',to_date('01.12.2009','dd.mm.yyyy'), 21.22); 
values(10004,'MANSANI, Luigi',to_date('01.12.2009','dd.mm.yyyy'), 17.22);
values(10004,'MANSANI, Luigi',to_date('01.12.2009','dd.mm.yyyy'), 1.23);
values(10004,'MANSANI, Luigi',to_date('01.12.2009','dd.mm.yyyy'), 145.10);

我的最终输出(我需要在 xml 中打印,然后在 excel 中打印,我使用的是 Oracle 应用程序)应该是这样的:

CODICE   NOME             DATA_FATTURA  TOTAL
------  ---------------   ------------  ----
10002   MANSANI, Luigi    01.12.2008    23.22
  /          /                 /        18.22
  /          /                 /        12.23
  /          /                 /        14.50
10004   MANSANI, LUIGI    01.12.2009    21.22
  /          /                 /        17.22
  /          /                 /        1.23
  /          /                 /        145.10

其中“/”应为空值,最终 excel 文件中的空单元格

考虑到您的 table 名称为 fattura 三列 codicenomedata_fattura,您可以尝试 运行以下陈述:

create table fattura
( codice       int,
  nome         varchar2(100),
  data_fattura date,
  total        number(10,2)
);

insert all 
  into fattura(codice,nome,data_fattura,total) values(10002,'MANSANI, Luigi',to_date('01.12.2008','dd.mm.yyyy'), 23.22) 
  into fattura(codice,nome,data_fattura,total) values(10002,'MANSANI, Luigi',to_date('01.12.2008','dd.mm.yyyy'), 18.22)
  into fattura(codice,nome,data_fattura,total) values(10002,'MANSANI, Luigi',to_date('01.12.2008','dd.mm.yyyy'), 12.23)
  into fattura(codice,nome,data_fattura,total) values(10002,'MANSANI, Luigi',to_date('01.12.2008','dd.mm.yyyy'), 14.50)
  into fattura(codice,nome,data_fattura,total) values(10004,'MANSANI, Luigi',to_date('01.12.2009','dd.mm.yyyy'), 21.22) 
  into fattura(codice,nome,data_fattura,total) values(10004,'MANSANI, Luigi',to_date('01.12.2009','dd.mm.yyyy'), 17.22)
  into fattura(codice,nome,data_fattura,total) values(10004,'MANSANI, Luigi',to_date('01.12.2009','dd.mm.yyyy'), 1.23)
  into fattura(codice,nome,data_fattura,total) values(10004,'MANSANI, Luigi',to_date('01.12.2009','dd.mm.yyyy'), 145.10)
select * from dual;

select  rn,
    first_value(codice ignore nulls) over (partition by codice order by codice rows between rn+1 following and unbounded following) codice,
    first_value(nome ignore nulls) over (partition by codice order by codice rows between rn+1 following and unbounded following) nome,
    first_value(data_fattura ignore nulls) over (partition by codice order by codice rows between rn+1 following and unbounded following) data_fattura,
    total
  from  
(  
 select codice, nome,data_fattura, total,
        row_number() over( partition by codice, nome, data_fattura order by codice ) rn 
   from fattura
);


RN   CODICE   NOME             DATA_FATTURA    TOTAL
--   ------  ---------------   ------------  -------    
1     10002   MANSANI, Luigi    01.12.2008     23,22
2                                              18,22
3                                              12,23
4                                              14,50
1     10004   MANSANI, Luigi    01.12.2009     21,22
2                                              17,22
3                                               1,23
4                                             145,10

Demo

您需要明确定义行的顺序。
这是使用订单代理 (ORDER BY rownum).
的解决方案 但是,虽然它似乎产生了正确的结果,但实际上 Oracle 并不能保证每次的顺序都相同。
确保您的 table 具有主键并将其作为订单子句的一部分。

SELECT CASE WHEN lag(nome) over(ORDER BY rownum)=nome THEN '/' ELSE to_char(codice) END codice
, CASE WHEN lag(nome) over(ORDER BY rownum)=nome THEN '/' ELSE to_char(nome) END nome
, CASE WHEN lag(nome) over(ORDER BY rownum)=nome THEN '/' ELSE to_char(data_fattura) END data_fattura
, VALUE
FROM test 

输出

10002 MANSANI, Luigi  01-DEC-08 23.22
/     /               /         18.22
/     /               /         12.23
/     /               /         14.5
10004 MANSANI, LUIGI  01-DEC-09 21.22
/     /               /         17.22
/     /               /         1.23
/     /               /         145.1