基于 LOV(清单)在具有多个值的交互式报告列上显示多个显示值
Show multiple display values on interactive report column with multiple values based on LOV (checklist)
我想在列中显示显示值,但该列是一个字符串,其中包含'1:3'、'2'、'1:2:4'等条目,它们是return 基于具有静态值的 LOV 的值。
如果我将列设置为 "Display text (Based on LOV)",它将仅适用于只有一个数字的条目,例如“3”或“1”。
我想规范化 table,但那样我就会有多个 table 形式。
这应该很简单,但我不知道该怎么做?
select p.COD,
UNIDADE_PROPONENTE,
CAUSA_FUND,
CAUSAS_RELAC,
TITULO,
DESC_SOLUC,
listagg(a.acao, ';<br><br>') within group (order by null) as "a.acao",
OUTRA_ACAO,
SUGESTAO,
SITUACAO
from TB_PROPOSTA p, TB_ACAO a,
table(cast(multiset(select level from dual
connect by level <=regexp_count(p.acao,':') + 1)
as sys.odcinumberlist)) x
where
a.cod = regexp_substr(p.acao, '[^:]+', 1, x.column_value)
and
(:P2_XUNIDADE_RESPONSAVEL = UNIDADE_PROPONENTE OR :P2_XUNIDADE_RESPONSAVEL IS NULL)
and
(INSTR(':'|| p.acao ||':', ':' || :P2_XACAO || ':') > 0 OR :P2_XACAO IS NULL)
group by p.cod, p.acao, unidade_proponente, causa_fund, causas_relac, titulo, desc_soluc, outra_acao, sugestao, situacao
order by p.cod, p.acao;
编辑:
现在我要么缺少关键字错误,要么 sql 命令未正确结束。
这个给出 SQL 命令未正确结束
select p.COD,
UNIDADE_PROPONENTE,
CAUSA_FUND,
CAUSAS_RELAC,
TITULO,
DESC_SOLUC,
listagg(a.acao, ';<br><br>') within group (order by null) as "a.acao",
OUTRA_ACAO,
SUGESTAO,
SITUACAO
from TB_PROPOSTA p
cross join table(cast(multiset(select level from dual
connect by level <=regexp_count(p.acao,':') + 1)
as sys.odcinumberlist)) x
left join TB_ACAO.ACAO
on TB_ACAO.COD = regexp_substr(TB_PROPOSTA.ACAO, '[^:]+', 1, x.column_value)
where
(:P2_XUNIDADE_RESPONSAVEL )= UNIDADE_PROPONENTE OR :P2_XUNIDADE_RESPONSAVEL IS NULL)
AND
(:P2_XACAO IN (p.ACAO) OR :P2_XACAO IS NULL)
group by p.cod, p.acao, unidade_proponente, causa_fund, causas_relac, titulo, desc_soluc, outra_acao, sugestao, situacao
order by p.cod, p.acao;
如果我将 "cross join" 更改为仅 "join",我会得到 "Missing keyword (ORA-06550: line 17, column 1: ORA-00905: missing keyword) right before the "where"
感谢您的补充说明。
这样的事情会有帮助吗?我的 TEST table 充当您的报告查询,而其余部分拆分冒号分隔值。这是一个 SQL*Plus 示例,只是为了向您展示正在发生的事情。
SQL> with test (situacao, tipo_acao) as
2 (select 'Aguardando resposta', '1:2:3' from dual union
3 select 'Aguardando resposta', '5' from dual
4 )
5 select
6 situacao,
7 'This is value ' || regexp_substr(tipo_acao, '[^:]+', 1, column_value) tipo_acao
8 from test,
9 table(cast(multiset(select level from dual
10 connect by level <= regexp_count(tipo_acao, ':') + 1)
11 as sys.odcinumberlist));
SITUACAO TIPO_ACAO
------------------- ----------------------------------
Aguardando resposta This is value 1
Aguardando resposta This is value 2
Aguardando resposta This is value 3
Aguardando resposta This is value 5
SQL>
[编辑,在您的 Apex 应用程序中创建第 5 页之后]
我想我明白了 - 请查看第 5 页(创建为第 2 页的副本,以免破坏它)。它的列列表有所减少,但您会了解总体思路。查询看起来像这样;希望没事:
select p.cod,
s.situacao,
p.tipo_acao,
listagg(t.acao, ', ') within group (order by null) acao
from tb_proposta p,
tipo_situacao s,
vw_unid v,
tipo_acao t,
table(cast(multiset(select level from dual
connect by level <= regexp_count(p.tipo_acao, ':') + 1)
as sys.odcinumberlist)) x
where s.cod = p.proposta_status
and p.cod_vw_unid = v.cod
and t.cod= regexp_substr(p.tipo_acao, '[^:]+', 1, x.column_value)
group by p.cod, s.situacao, p.tipo_acao
order by p.cod, p.tipo_acao;
[编辑 #2,ANSI 外连接]
这就是您应该尝试的方式。此外,CROSS JOIN 及其在查询中的位置。
select p.cod,
s.situacao,
p.tipo_acao,
listagg(t.acao, ', ') within group (order by null) acao
from tb_proposta p
cross join table(cast(multiset(select level from dual
connect by level <= regexp_count(p.tipo_acao, ':') + 1)
as sys.odcinumberlist)) x
join tipo_situacao s on s.cod = p.proposta_status
join vw_unid v on v.cod = p.cod_vw_unid
left join tipo_acao t on t.cod = regexp_substr(p.tipo_acao, '[^:]+', 1, x.column_value)
group by p.cod, s.situacao, p.tipo_acao
order by p.cod, p.tipo_acao;
我想在列中显示显示值,但该列是一个字符串,其中包含'1:3'、'2'、'1:2:4'等条目,它们是return 基于具有静态值的 LOV 的值。
如果我将列设置为 "Display text (Based on LOV)",它将仅适用于只有一个数字的条目,例如“3”或“1”。
我想规范化 table,但那样我就会有多个 table 形式。 这应该很简单,但我不知道该怎么做?
select p.COD,
UNIDADE_PROPONENTE,
CAUSA_FUND,
CAUSAS_RELAC,
TITULO,
DESC_SOLUC,
listagg(a.acao, ';<br><br>') within group (order by null) as "a.acao",
OUTRA_ACAO,
SUGESTAO,
SITUACAO
from TB_PROPOSTA p, TB_ACAO a,
table(cast(multiset(select level from dual
connect by level <=regexp_count(p.acao,':') + 1)
as sys.odcinumberlist)) x
where
a.cod = regexp_substr(p.acao, '[^:]+', 1, x.column_value)
and
(:P2_XUNIDADE_RESPONSAVEL = UNIDADE_PROPONENTE OR :P2_XUNIDADE_RESPONSAVEL IS NULL)
and
(INSTR(':'|| p.acao ||':', ':' || :P2_XACAO || ':') > 0 OR :P2_XACAO IS NULL)
group by p.cod, p.acao, unidade_proponente, causa_fund, causas_relac, titulo, desc_soluc, outra_acao, sugestao, situacao
order by p.cod, p.acao;
编辑: 现在我要么缺少关键字错误,要么 sql 命令未正确结束。 这个给出 SQL 命令未正确结束
select p.COD,
UNIDADE_PROPONENTE,
CAUSA_FUND,
CAUSAS_RELAC,
TITULO,
DESC_SOLUC,
listagg(a.acao, ';<br><br>') within group (order by null) as "a.acao",
OUTRA_ACAO,
SUGESTAO,
SITUACAO
from TB_PROPOSTA p
cross join table(cast(multiset(select level from dual
connect by level <=regexp_count(p.acao,':') + 1)
as sys.odcinumberlist)) x
left join TB_ACAO.ACAO
on TB_ACAO.COD = regexp_substr(TB_PROPOSTA.ACAO, '[^:]+', 1, x.column_value)
where
(:P2_XUNIDADE_RESPONSAVEL )= UNIDADE_PROPONENTE OR :P2_XUNIDADE_RESPONSAVEL IS NULL)
AND
(:P2_XACAO IN (p.ACAO) OR :P2_XACAO IS NULL)
group by p.cod, p.acao, unidade_proponente, causa_fund, causas_relac, titulo, desc_soluc, outra_acao, sugestao, situacao
order by p.cod, p.acao;
如果我将 "cross join" 更改为仅 "join",我会得到 "Missing keyword (ORA-06550: line 17, column 1: ORA-00905: missing keyword) right before the "where"
感谢您的补充说明。
这样的事情会有帮助吗?我的 TEST table 充当您的报告查询,而其余部分拆分冒号分隔值。这是一个 SQL*Plus 示例,只是为了向您展示正在发生的事情。
SQL> with test (situacao, tipo_acao) as
2 (select 'Aguardando resposta', '1:2:3' from dual union
3 select 'Aguardando resposta', '5' from dual
4 )
5 select
6 situacao,
7 'This is value ' || regexp_substr(tipo_acao, '[^:]+', 1, column_value) tipo_acao
8 from test,
9 table(cast(multiset(select level from dual
10 connect by level <= regexp_count(tipo_acao, ':') + 1)
11 as sys.odcinumberlist));
SITUACAO TIPO_ACAO
------------------- ----------------------------------
Aguardando resposta This is value 1
Aguardando resposta This is value 2
Aguardando resposta This is value 3
Aguardando resposta This is value 5
SQL>
[编辑,在您的 Apex 应用程序中创建第 5 页之后]
我想我明白了 - 请查看第 5 页(创建为第 2 页的副本,以免破坏它)。它的列列表有所减少,但您会了解总体思路。查询看起来像这样;希望没事:
select p.cod,
s.situacao,
p.tipo_acao,
listagg(t.acao, ', ') within group (order by null) acao
from tb_proposta p,
tipo_situacao s,
vw_unid v,
tipo_acao t,
table(cast(multiset(select level from dual
connect by level <= regexp_count(p.tipo_acao, ':') + 1)
as sys.odcinumberlist)) x
where s.cod = p.proposta_status
and p.cod_vw_unid = v.cod
and t.cod= regexp_substr(p.tipo_acao, '[^:]+', 1, x.column_value)
group by p.cod, s.situacao, p.tipo_acao
order by p.cod, p.tipo_acao;
[编辑 #2,ANSI 外连接]
这就是您应该尝试的方式。此外,CROSS JOIN 及其在查询中的位置。
select p.cod,
s.situacao,
p.tipo_acao,
listagg(t.acao, ', ') within group (order by null) acao
from tb_proposta p
cross join table(cast(multiset(select level from dual
connect by level <= regexp_count(p.tipo_acao, ':') + 1)
as sys.odcinumberlist)) x
join tipo_situacao s on s.cod = p.proposta_status
join vw_unid v on v.cod = p.cod_vw_unid
left join tipo_acao t on t.cod = regexp_substr(p.tipo_acao, '[^:]+', 1, x.column_value)
group by p.cod, s.situacao, p.tipo_acao
order by p.cod, p.tipo_acao;