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
三列 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
您需要明确定义行的顺序。
这是使用订单代理 (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
我很难解释我的问题。我做了一个 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
三列 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
您需要明确定义行的顺序。
这是使用订单代理 (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