- Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 6 anos, 2 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
29 de agosto de 2018 às 4:45 pm #109390Fernando NuñezParticipante
Olá preciso que a subconsulta abaixo seja o filtro do relatório para que possamos tirar o relatório por empresa:
(select mrf1.rf1_empresa
from mrf1
where substr(usuario,2) = mrf1.rf1_colaborador) UnidadeO relatório todo é esse:
with t_cliente as (select distinct rota.db_rota_repres, cliente.db_cli_codigo, cliente.db_cli_nome, clic.db_clic_latitud, clic.db_clic_longitud, mrf1.rf1_empresa
from db_rotas rota
, db_rotas_linhas rotal
, db_cliente cliente
, db_cliente_compl clic
, mrf1where rota.db_rota_codigo = rotal.db_rotal_codigo
and rotal.db_rotal_cliente = cliente.db_cli_codigo
and cliente.db_cli_codigo = clic.db_clic_cod
and cliente.db_cli_repres = mrf1.rf1_colaborador)
select usuario
, nome
, (select mrf1.rf1_empresa
from mrf1
where substr(usuario,2) = mrf1.rf1_colaborador) Unidade
, to_char(data_hora_inicial,’DD/MM/YYYY’) data_inicio_ponto
, to_char(data_hora_inicial,’hh24:mi’) hora_inicio_ponto
, latitude_dh_inicial Latitude_inicial
, longitude_dh_inicial Longitude_inicial
, cliente Cliente_mais_proximo_inicial, (select db_cli_nome
from db_cliente
where cliente = db_cli_codigo ) Nome_Cliente_Inicial
, distancia_inicial
, to_char(data_hora_final, ‘DD/MM/YYYY’) Data_fim_Ponto
, to_char(data_hora_final, ‘hh24:mi’) Hora_fim_Ponto
, latitude_dh_final
, longitude_dh_final
, db_cli_codigo Cliente_mais_proximo_final
, db_cli_nome Nome_Cliente
, distancia_final Distancia_metros_final_pontofrom (
select usuario
, nome
, data_hora_inicial
, cliente
, latitude_dh_inicial
, longitude_dh_inicial
, distancia_inicial
, data_hora_final
, latitude_dh_final
, longitude_dh_final
, db_cli_codigo
, db_cli_nome
, db_clic_latitud
, db_clic_longitud
, distancia_final
, rank () over (partition by usuario, data_hora_final order by distancia_final) mais_proximo
from (
select ponto.usuario
, usuario.nome
, ponto.data_hora_inicial
, ponto.latitude_dh_inicial
, ponto.longitude_dh_inicial
, ponto.data_hora_final
, ponto.latitude_dh_final
, ponto.longitude_dh_final
, ponto.cliente
,(select round(MERCF_CALCDISTANCIA (ponto.latitude_dh_inicial
, ponto.longitude_dh_inicial
, (select db_clic_latitud from db_cliente_compl where db_clic_cod = ponto.cliente)
, (select db_clic_longitud from db_cliente_compl where db_clic_cod = ponto.cliente)), 2)
from dual) distancia_inicial
, t_cliente.db_cli_codigo
, t_cliente.db_cli_nome
, t_cliente.db_clic_latitud
, t_cliente.db_clic_longitud
, (select round(MERCF_CALCDISTANCIA (ponto.latitude_dh_final
, ponto.longitude_dh_final
, t_cliente.db_clic_latitud
, t_cliente.db_clic_longitud), 2)from dual) distancia_final
from db_ponto_eletronico ponto
, db_usuario usuario
, t_clientewhere usuario.usuario = ponto.usuario
and t_cliente.db_rota_repres = usuario.codigo_acesso)
)
where mais_proximo = 129 de agosto de 2018 às 8:20 pm #109391José Laurindo ChiappaModeradorBlz ? Então, primeiro de tudo o que vc escreveu no trecho :
…
select mrf1.rf1_empresa
from mrf1
where substr(usuario,2) = mrf1.rf1_colaborador) Unidade
, to_char(data_hora_inicial,’DD/MM/YYYY’) data_inicio_ponto
, to_char(data_hora_inicial,’hh24:mi’) hora_inicio_ponto
, latitude_dh_inicial Latitude_inicial
, longitude_dh_inicial Longitude_inicial
, cliente Cliente_mais_proximo_inicial
……Simplesmente NÂO FAZ SENTIDO !!!! veja vc, a sintaxe de um WHERE exige que as diferentes condições/colunas a participarem de um filtro sejam interligadas com um AND ou com um OR, esse amontoado de colunas separadas por vírgula Não Fazem Sentido nenhum…..
Outra coisa que vc (aí SIM) pode fazer numa cláusula WHERE é usar operadores de conjuntos/multi-valores, como IN ou EXISTS : por exemplo, é uma sintaxe Totalmente Válida eu escrever :
…
SELECT colunasqueeuqueroexibir
FROM tabela T
WHERE (coluna1, coluna2, coluna3) in (select colunaA, colunaB, colunaC from outratabela O where condições AND o.coluna = T.coluna )
….==> TALVEZ seja alguma coisa do tipo que vc tem em mente, mas ** PLEASE ** , consulte o manual de SQL no capítulo de sub-queries DA SUA VERSÂO DE BANCO ORACLE (https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries007.htm#SQLRF52340 é o da versão 11g, por exemplo) e veja a sintaxe exigida e os operadores permitidos, senão fica Extremamente Difícil a gente escrever seja o que for pra vc….
E outra coisa : quando vc for dar um exemplo, PLEASE manda uma versão REDUZIDA e SIMPLIFICADA do SQL, que contenha só o ponto principal que te causa dúvida, e o menos possível de colunas mas que reproduza o seu problema – é INVIÁVEL a gente analisar aqui SQLs complexos ….
[]s
Chiappa
29 de agosto de 2018 às 8:46 pm #109392Fernando NuñezParticipanteAmigo Chiappa,
Se você reparar esse trecho:
(select mrf1.rf1_empresa
from mrf1
where substr(usuario,2) = mrf1.rf1_colaborador) Unidadeestá entre parenteses, ou seja é mais uma coluna do relatório, pois esse campo empresa não existe nas tabelas do relatório, então tive que traze-lo dessa tabela mrf1.
30 de agosto de 2018 às 12:40 am #109393José Laurindo ChiappaModeradorTá bom, mas REPITO : se vc quer ter uma sub-query no WHERE , vc tem que usar os operador lógicos AND/OR ou operadores multivalues como EXISTS ou IN….
E outra coisa (que parece ser o que vc precisa) : no seu caso (muito embora eu NÂO TENHA conseguido analisar esse monstrinho aí – sorry mas tá grande demais pro meu timespan de 5 minutos, que é o máximo que eu uso nas respostas), ao que me parece vc definiu essa coluna unidade NÂO numa sub-query, mas numa coluna CALCULADA :select usuario
, nome
, (select mrf1.rf1_empresa from mrf1 where substr(usuario,2) = mrf1.rf1_colaborador) Unidade
, to_char(data_hora_inicial,'DD/MM/YYYY') data_inicio_ponto
, to_char(data_hora_inicial,'hh24:mi') hora_inicio_ponto
, latitude_dh_inicial Latitude_inicial
, longitude_dh_inicial Longitude_inicial
, cliente Cliente_mais_proximo_inicial
... FROM .....
Como essa coluna UNIDADE não é uma sub-query, não pode ser usada num WHERE, só quem a enxerga é o próprio SELECT… Uma opção para ‘MATERIALIZAR’ essa coluna (e assim poder usar ela num WHERE) pode ser :SELECT *
FROM (
select usuario
, nome
, (select mrf1.rf1_empresa from mrf1 where substr(usuario,2) = mrf1.rf1_colaborador) Unidade
, to_char(data_hora_inicial,'DD/MM/YYYY') data_inicio_ponto
, to_char(data_hora_inicial,'hh24:mi') hora_inicio_ponto
, latitude_dh_inicial Latitude_inicial
, longitude_dh_inicial Longitude_inicial
, cliente Cliente_mais_proximo_inicial
... FROM .....
)
WHERE Unidade = valor a ser comparado....
===>> MAS REPITO : diminui BASTANTE esse SQL, reduz ele ao MÍNIMO DO MÍNIMO POSSÌVEL se vc quer que a gente possa analisar ele mais detalhadamente…[]s
Chiappa
31 de agosto de 2018 às 1:21 am #109394Fernando NuñezParticipanteObrigado Chiappa, assim funcionou perfeitamente!
31 de agosto de 2018 às 1:47 am #109395José Laurindo ChiappaModeradorBlz…
31 de agosto de 2018 às 1:57 am #109396José Laurindo ChiappaModeradorE só pra constar : sempre que vc tenha uma coluna Calculada (que é parte de uma EXPRESSÃO, e não uma ‘subquery’, mais rigorosamente definindo) o valor da expressão é conhecido apenas na cláusula do SELECT, vc não pode usar o nome dessa ‘pseudo-coluna’ num WHERE ou num ORDER BY… Por exemplo, considere a query :
select Gc_Staff_Number
, start_date
, lag (end_date) over (partition by Gc_Staff_Number
order by start_date )
as PREV_END_DATE
, current_flag
from employment_history;
==> Veja que essa coluna ‘fictícia’ PREV_END_DATE é composta por uma Expressão : essa expressão NÃO contém uma query, mas ainda assim : sendo uma Expressão, vc NÃO a pode usar diretamente nem no WHERE e nem no ORDER BY…. Se eu quisesse fazer um WHERE por essa coluna , sou obrigado a materializar ela :SELECT * FROM (select Gc_Staff_Number
, start_date
, lag (end_date) over (partition by Gc_Staff_Number
order by start_date )
as PREV_END_DATE
, current_flag
from employment_history;
)
WHERE PREV_END_DATE < SYSDATE;
Blz ?? NÃO é só quando a expressão contém uma Query.... A ** Exceção ** é quando a expressão é repetível, por exemplo uma conta / operação aritmética e/ou booleana, tipo :select Gc_Staff_Number
, start_date
, start_date -1 as YEST_DATE
, current_flag
from employment_history;
==> Neste caso eu poderia fazer :select Gc_Staff_Number
, start_date
, start_date -1 as YEST_DATE
, current_flag
from employment_history
where start_date -1 < SYSDATE;
okdoc ??[]s
Chiappa
-
AutorPosts
- Você deve fazer login para responder a este tópico.