Pular para o conteúdo
  • Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 5 anos, 8 meses atrás por Avatar de José Laurindo ChiappaJosé Laurindo Chiappa.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #109390
    Avatar de Fernando NuñezFernando Nuñez
    Participante

      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) Unidade

      O 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
      , mrf1

      where 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_ponto

      from (
      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_cliente

      where usuario.usuario = ponto.usuario
      and t_cliente.db_rota_repres = usuario.codigo_acesso

      )

      )
      where mais_proximo = 1

      #109391
      Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
      Moderador

        Blz ? 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

        #109392
        Avatar de Fernando NuñezFernando Nuñez
        Participante

          Amigo Chiappa,

          Se você reparar esse trecho:
          (select mrf1.rf1_empresa
          from mrf1
          where substr(usuario,2) = mrf1.rf1_colaborador) Unidade

          está 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.

          #109393
          Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
          Moderador

            Tá 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

            #109394
            Avatar de Fernando NuñezFernando Nuñez
            Participante

              Obrigado Chiappa, assim funcionou perfeitamente!

              #109395
              Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
              Moderador

                Blz…

                #109396
                Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
                Moderador

                  E 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

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.
                plugins premium WordPress