Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #90973
    Itimura
    Participante

      olá pessoal, de ante-mão ja parabenizo a todos, buscando por respostas antes de criar este vi o pessoal empenhado em tentar ajudar, meu caso é simples mas não condigo conciliar minha dúvida no oracle

      vamos lá

      Minha query funciona! ela me traz os dados que preciso, mas como não é pra mim este relatório preciso “maquiar” um pouquinho

      Minha Query:


      SELECT
      MOV.CODCLI AS COD_CLIENTE,
      MOV.CODFORNEC AS COD_FORNECEDOR,
      SUM(MOV.QT * MOV.PTABELA) AS VALOR_VENDA

      FROM PCMOV MOV, PCCLIENT CLI

      WHERE
      MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT WHERE CODUSUR1 = 93)
      AND MOV.CODFORNEC != 0
      AND MOV.DTMOV BETWEEN '01102009' AND '31102009'

      GROUP BY MOV.CODFORNEC
      ORDER BY MOV.CODCLI

      Legal, agora vem a maquiagem, o nome do cliente, o nome do fornecedor… etc…

      pela lógica do Group By eu devo colocar os mesmos campos que eu coloquei no select, mas deve ter outra forma para trazer o nome do cliente e os outros campos que quero sem a necessidade de informa-lo no group by

      porque vocês ja devem saber se eu coloca-los la, minha query que trazia dados realsi vai trazer dados que não serão os corretos,

      pela lógica que eu imaginaria seria essa:


      SELECT
      MOV.CODCLI AS COD_CLIENTE,
      CLI.CLIENTE AS NOME_CLIENTE,
      CLI.ENDERENT AS ENDERECO,
      MOV.CODFORNEC AS COD_FORNECEDOR,
      FORNEC.FORNECEDOR AS FORNECEDOR,
      SUM(MOV.QT * MOV.PTABELA) AS VALOR_VENDA

      FROM PCMOV MOV, PCCLIENT CLI, PCFORNEC FORNEC

      WHERE
      MOV.CODCLI = CLI.CODCLI
      AND MOV.CODFORNEC = FORNEC.CODFORNEC
      AND MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT WHERE CODUSUR1 = 93)
      AND MOV.CODFORNEC != 0
      AND MOV.DTMOV BETWEEN '01102009' AND '31102009'

      GROUP BY MOV.CODFORNEC, MOV.CODCLI
      ORDER BY MOV.CODCLI

      mas ai ele reclama que eu não coloquei eles no Group By

      Resolvo isso com um Union?

      #90982
      fsitja
      Participante

        Deveria trazer os dados corretos se você colocar os nomes no group by, a menos que a junção tenha buscado 2 nomes (ou nenhum nome) para fornecedor, por exemplo.

        Se o caso for que não tem correspondente na tabela de nomes, tente um left outer join. Se estiver vindo mais de uma linha, verifique o relacionamento entre as tabelas, se não está faltando uma coluna no where para ligar.

        Fora isso, o que você poderia fazer é colocar sua query versão funcionando como sub-query na sua query “versão cosmética”, no from dela, fazendo join com a tabela de nomes.


        SELECT MOVCLI.COD_CLIENTE,
        MOVCLI.COD_FORNECEDOR,
        FORNEC.FORNECEDOR,
        MOVCLI.VALOR_VENDA
        FROM (
        SELECT
        MOV.CODCLI AS COD_CLIENTE,
        MOV.CODFORNEC AS COD_FORNECEDOR,
        SUM(MOV.QT * MOV.PTABELA) AS VALOR_VENDA
        FROM PCMOV MOV, PCCLIENT CLI
        WHERE
        MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT WHERE CODUSUR1 = 93)
        AND MOV.CODFORNEC != 0
        AND MOV.DTMOV BETWEEN '01102009' AND '31102009'
        GROUP BY MOV.CODFORNEC) movcli
        LEFT JOIN PCFORNEC FORNEC ON FORNEC.CODFORNEC = MOVCLI.COD_FORNECEDOR

        Fiquei com uma dúvida. No where você compara MOV.DTMOV com strings ‘01102009’. Esse campo é data ou é varchar2? Se for data, use to_date(‘01102009’, ‘DDMMYYYY’) na comparação para evitar erros caso a configuração de NLS_DATE_FORMAT seja alterada no servidor.

        #90983
        Avatar photoLeonardo Litz
        Participante

          Cara, tenta fazer assim:

          SELECT SUM(A.QT * A.PTABELA) AS VALOR_VENDA,
          COD_CLIENTE,
          COD_FORNECEDOR
          FROM (
          SELECT
          MOV.CODCLI AS COD_CLIENTE,
          MOV.CODFORNEC AS COD_FORNECEDOR,
          MOV.QT ,
          MOV.PTABELA

           FROM PCMOV MOV, PCCLIENT CLI 
          
                WHERE 
                MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT  WHERE CODUSUR1 = 93) 
            AND MOV.CODFORNEC != 0 
            AND MOV.DTMOV BETWEEN '01102009' AND '31102009' ) A
          

          GROUP BY COD_FORNECEDOR
          ORDER BY COD_CLIENTE

          Mas a melhor forma de vc fazer isso é criando um view e dando permissão somente de select nela para o usuário.

          Vlw Leonardo Litz

          #90988
          burga
          Participante

            Oi Itimura,

            Me desculpe mas eu não entendi porque colocando os demais campos no group by vai fazer com que os dados se tornem incorretos, se você precisa apresentar esses dados, supondo que o banco esteja fazendo a consistência corretamente…

            Caso seja porque pode ocorrer de não existir o fornecedor ou cliente, você pode usar o left outer join, como o fsitja já disse…

            Se as mensagens do fsitja e do Leonardo ainda não ajudarem, você poderia explicar um pouco melhor o que você espera como retorno e porque se colocar no group by todos os campos que você precisa retornar faz com que os dados retornem de forma errada… 😀

            #90993
            Itimura
            Participante

              galera, me desculpe, por algum motivo ou erro de digitação eu não estava conseguindo os dados que eu queria, falha minha como o BURGA disse, eu revi minha query, e acertei o que estava errado em um relacionamento entre as tabelas

              o fato de eu colocar todos os campos do select dentro do Group by eu pensava que traria dados errados, com inconsistencia de não existir os mesmos nas outras tabelas.

              enfim, minha query ficou assim:


              SELECT
              MOV.CODCLI AS COD_CLIENTE,
              CLI.CLIENTE AS NOME_CLIENTE,
              CLI.ENDERENT AS ENDERECO,
              CLI.BAIRROENT AS BAIRRO,
              CLI.ESTENT AS CIDADE,
              CLI.DTULTCOMP AS UCOMPRA,
              CLI.BLOQUEIO AS BLOQUEADO,
              MOV.CODFORNEC AS COD_FORNECEDOR,
              FORNEC.FORNECEDOR AS FORNECEDOR,
              SUM(MOV.QT * MOV.PTABELA) AS VALOR_VENDA

               FROM PCMOV MOV, PCCLIENT CLI, PCFORNEC FORNEC
              
                    WHERE 
                    MOV.CODCLI    =   CLI.CODCLI
                AND MOV.CODFORNEC =   FORNEC.CODFORNEC
                AND MOV.CODCLI IN (SELECT CODCLI FROM PCCLIENT  WHERE CODUSUR1 = 93)
                AND MOV.CODFORNEC != 0
                AND MOV.DTMOV BETWEEN '01102009' AND '31102009'
              

              GROUP BY
              MOV.CODFORNEC,
              MOV.CODCLI,
              CLI.CLIENTE,
              CLI.ENDERENT,
              FORNEC.FORNECEDOR,
              CLI.BAIRROENT,
              CLI.ESTENT,
              CLI.DTULTCOMP,
              CLI.BLOQUEIO
              ORDER BY MOV.CODCLI

              DESCULPEM PELA FALHA!mas agradecido!

              Obrigado a todos

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