我在解释我的问题时遇到了困难。我已经制作了一个PLSQL程序,它通过一个简单的查询从多个表中获取数据,然后将输出发送到一个游标,然后将结果输出为xml,然后最终打印为以下excel
我想要的是将空值放在红色矩形下的值中,因为它们之前的行具有相同的“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文件中的空单元格
答案 0 :(得分:1)
将您的表名称视为fattura
,其中包含三列codice
,nome
和data_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
答案 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