在重复的PLSQL游标输出行中为null

时间:2018-03-13 12:01:53

标签: sql xml oracle plsql cursor

我在解释我的问题时遇到了困难。我已经制作了一个PLSQL程序,它通过一个简单的查询从多个表中获取数据,然后将输出发送到一个游标,然后将结果输出为xml,然后最终打印为以下excel

enter image description here

我想要的是将空值放在红色矩形下的值中,因为它们之前的行具有相同的“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文件中的空单元格

2 个答案:

答案 0 :(得分:1)

将您的表名称视为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

答案 1 :(得分:0)

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

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