none
Agrupamento por gerente RRS feed

  • Pergunta

  • Meu Gerente solicitou que o relatório de PMR ( Calculo usado aqui ) seja agrupado também por gerente.

    minha dificuldade é retornar os dados agrupados dessa forma. Existem dois exemplos, um, agrupado por cliente e outro por representante. (Os dois casos são o mesmo relatório com agrupamentos diferentes).

    Para agrupar por gerente existe dentro da tabela NotaFisc o campo CdGerente. Esse campo é o mesmo campo CdUsuario da tabela de Usuários.

    Alguém poderia me ajudar?

    SELECT CdRepresentante AS Cod, CONVERT(VARCHAR(30),CdFantasiaRepresentante) AS Representante, COUNT(1) AS 'Negócios', DBO.FnFormatFloat(SUM(PMR) / SUM(VLRECEITA)) AS PMR FROM (  SELECT R.CDRECEITA, R.CDNOTAFISCAL, R.CDDOCUMENTO, R.DTEMISSAO, R.DtProrrogacao, RP.CdRepresentante,         (CAST(ISNULL(R.DtProrrogacao,0) - ISNULL(R.DTEMISSAO,0) AS INTEGER) * ISNULL(R.VLRECEITA,0)) AS PMR,         R.VLRECEITA, NG.CdFilial, NG.CdNegocio, C.CdCliente, C.CdFantasia, RP.CdFantasia AS CdFantasiaRepresentante,         F.DsUsual, C.InConsumidorRevendedor  FROM RECEITAS R    INNER JOIN NotaFisc NF ON R.CDNOTAFISCAL     = NF.CDNOTAFISCAL    INNER JOIN Filiais   F ON F.CdFilial         = NF.CdFilial    INNER JOIN Negocios NG ON NF.CdNegocio       = NG.CdNegocio    INNER JOIN Represen RP ON NG.CdRepresentante = RP.CdRepresentante OR NG.CdGerenteConta = RP.CdRepresentante    INNER JOIN Clientes  C ON C.CdCliente = NG.CdContato  WHERE R.DTEMISSAO BETWEEN '20180101' AND '20180131'    AND R.CDNOTAFISCAL IS NOT NULL     AND R.INSTATUS IN (0,1)    AND (CAST(ISNULL(R.DtProrrogacao,0) - ISNULL(R.DTEMISSAO,0) AS INTEGER) * ISNULL(R.VLRECEITA,0)) > 0) TGROUP BY CdRepresentante, CdFantasiaRepresentante



    SELECT CdCliente AS Cod , CONVERT(VARCHAR(30),CdFantasia) AS Cliente, COUNT(1) AS "Negócios", DBO.FnFormatFloat(SUM(PMR) / SUM(VLRECEITA)) AS PMRFROM(  SELECT R.CDRECEITA, R.CDNOTAFISCAL, R.CDDOCUMENTO, R.DTEMISSAO, R.DtProrrogacao, RP.CdRepresentante,         (CAST(ISNULL(R.DtProrrogacao,0) - ISNULL(R.DTEMISSAO,0) AS INTEGER) * ISNULL(R.VLRECEITA,0)) AS PMR,         R.VLRECEITA, NG.CdFilial, NG.CdNegocio, C.CdCliente, C.CdFantasia, RP.CdFantasia AS CdFantasiaRepresentante,         F.DsUsual, C.InConsumidorRevendedor    FROM RECEITAS R    INNER JOIN NotaFisc NF ON R.CDNOTAFISCAL     = NF.CDNOTAFISCAL    INNER JOIN Filiais   F ON F.CdFilial         = NF.CdFilial    INNER JOIN Negocios NG ON NF.CdNegocio       = NG.CdNegocio    INNER JOIN Represen RP ON NG.CdRepresentante = RP.CdRepresentante OR NG.CdGerenteConta = RP.CdRepresentante    INNER JOIN Clientes  C ON C.CdCliente = NG.CdContato  WHERE R.DTEMISSAO BETWEEN '20180101' AND '20180131'    AND R.CDNOTAFISCAL IS NOT NULL     AND R.INSTATUS IN (0,1)    AND (CAST(ISNULL(R.DtProrrogacao,0) - ISNULL(R.DTEMISSAO,0) AS INTEGER) * ISNULL(R.VLRECEITA,0)) > 0) TGROUP BY CdCliente, CdFantasia



    • Editado Bruno Xaavier quinta-feira, 8 de fevereiro de 2018 19:25 Erro de escrita
    quinta-feira, 8 de fevereiro de 2018 17:28

Respostas

Todas as Respostas

  • Boa tarde, ficou um pouco confuso a descrição. 

    Qual é o problema com a coluna de gerente, pois não seria o caso alterar/replicar essa consulta incluindo a coluna necessária e adicionar a mesma no "Group By"?

    Segue um exemplo (verifique se a coluna de gerente está correta).

    SELECT CdRepresentante AS Cod,
    NF.CdGerente AS CdGerente ,
    CONVERT(VARCHAR(30),CdFantasiaRepresentante) AS Representante, 
    COUNT(1) AS 'Negócios', 
    DBO.FnFormatFloat(SUM(PMR) / SUM(VLRECEITA)) AS PMR 

    FROM (  SELECT R.CDRECEITA, R.CDNOTAFISCAL, R.CDDOCUMENTO, R.DTEMISSAO, R.DtProrrogacao, RP.CdRepresentante,NF.CdGerente,(CAST(ISNULL(R.DtProrrogacao,0) - ISNULL(R.DTEMISSAO,0) AS INTEGER) * ISNULL(R.VLRECEITA,0)) AS PMR, R.VLRECEITA, NG.CdFilial, NG.CdNegocio, C.CdCliente, C.CdFantasia, RP.CdFantasia AS CdFantasiaRepresentante, F.DsUsual, C.InConsumidorRevendedor  
    FROM RECEITAS R    
    INNER JOIN NotaFisc NF ON R.CDNOTAFISCAL     = NF.CDNOTAFISCAL    
    INNER JOIN Filiais   F ON F.CdFilial         = NF.CdFilial    
    INNER JOIN Negocios NG ON NF.CdNegocio       = NG.CdNegocio    
    INNER JOIN Represen RP ON NG.CdRepresentante = RP.CdRepresentante OR NG.CdGerenteConta = RP.CdRepresentante    
    INNER JOIN Clientes  C ON C.CdCliente = NG.CdContato  
    WHERE R.DTEMISSAO BETWEEN '20180101' AND '20180131'    
    AND R.CDNOTAFISCAL IS NOT NULL     
    AND R.INSTATUS IN (0,1)    
    AND (CAST(ISNULL(R.DtProrrogacao,0) - ISNULL(R.DTEMISSAO,0) AS INTEGER) * ISNULL(R.VLRECEITA,0)) > 0) T
    GROUP BY CdRepresentante, CdGerente, CdFantasiaRepresentante


    Wyllian de Lima - Se a resposta ajudou vote como útil !

    quinta-feira, 8 de fevereiro de 2018 17:54
  • Desculpa se ficou confuso, fiz meio correndo.

    citei ali dois exemplos de como são agrupados hoje, um agrupamento por clientes e o outro por representantes.

    Necessito agora fazer um agrupamento por gerente, fiquei em duvida se deveria fazer outro INNER JOIN com a tabela CdUsuario pois somente a tabela NotaFisc possui o registro de gerentes.

    quinta-feira, 8 de fevereiro de 2018 18:02
  • Então é isso mesmo, segue o exemplo da query que eu te mandei. Se precisar adicionar ou tirar alguma coluna não esqueça de fazer o mesmo no Group By.

    Se não precisar do nome do gerente não tem necessidade de fazer join com outra tabela, mas se precisar é só pegar na tabela correspondente.

    Boa sorte.


    Wyllian de Lima - Se a resposta ajudou vote como útil !

    quinta-feira, 8 de fevereiro de 2018 18:21
  • Deleted
    • Marcado como Resposta Bruno Xaavier quinta-feira, 8 de fevereiro de 2018 19:25
    quinta-feira, 8 de fevereiro de 2018 18:25
  • Encontrei o erro que estava me prendendo, não estava colocando os dados correto no primeiro sub-select, consegui todos os dados necessários para o sistema com o código abaixo.

    SELECT CdGerente AS Cod , CONVERT(VARCHAR(30),DsNome) AS Gerente, COUNT(1) AS "Negócios", DBO.FnFormatFloat(SUM(PMR) / SUM(VLRECEITA)) AS PMR
    FROM
    (  SELECT R.CDRECEITA, R.CDNOTAFISCAL, R.CDDOCUMENTO, R.DTEMISSAO, R.DtProrrogacao, RP.CdRepresentante,
             (CAST(ISNULL(R.DtProrrogacao,0) - ISNULL(R.DTEMISSAO,0) AS INTEGER) * ISNULL(R.VLRECEITA,0)) AS PMR,
             R.VLRECEITA, NG.CdFilial, NG.CdNegocio, C.CdCliente, C.CdFantasia, RP.CdFantasia AS CdFantasiaRepresentante,
             F.DsUsual, C.InConsumidorRevendedor, NF.CdGerente, U.DsNome
      
      FROM RECEITAS R
        INNER JOIN NotaFisc NF ON R.CDNOTAFISCAL     = NF.CDNOTAFISCAL
        INNER JOIN Filiais   F ON F.CdFilial         = NF.CdFilial
        INNER JOIN Negocios NG ON NF.CdNegocio       = NG.CdNegocio
        INNER JOIN Represen RP ON NG.CdRepresentante = RP.CdRepresentante OR NG.CdGerenteConta = RP.CdRepresentante
        INNER JOIN Clientes  C ON C.CdCliente = NG.CdContato
        inner join Usuarios U on U.CdUsuario = NF.CdGerente
      WHERE R.DTEMISSAO BETWEEN '20180101' AND '20180131'
        AND R.CDNOTAFISCAL IS NOT NULL 
        AND R.INSTATUS IN (0,1)
        AND (CAST(ISNULL(R.DtProrrogacao,0) - ISNULL(R.DTEMISSAO,0) AS INTEGER) * ISNULL(R.VLRECEITA,0)) > 0) T
    GROUP BY CdGerente, DsNome

    Obrigado a todos que tentaram me auxiliar.


    • Editado Bruno Xaavier quinta-feira, 8 de fevereiro de 2018 19:26
    quinta-feira, 8 de fevereiro de 2018 19:24
  • Bruno, enxuguei os códigos, pois havia muitas colunas na subconsulta que não eram utilizadas na consulta externa.

    O relatório por gerente é para emitir independente de filial ou qualquer outra informação?

    Na tabela Usuarios, qual é o nome da coluna que contém o nome do usuário?

    Eis sugestão:

    -- código #1
    with T as (
    SELECT NF.CdGerente, U.NomeUsuario as NomeGerente, 
           cast(coalesce(R.DtProrrogacao,0) - coalesce(R.DTEMISSAO,0) as integer) * coalesce(R.VLRECEITA,0) as PMR, 
           R.VLRECEITA
      from RECEITAS as R    
           inner join NotaFisc as NF on R.CDNOTAFISCAL = NF.CDNOTAFISCAL    
           inner join Usuarios as U on U.CdUsuario = NF.CdGerente
      where R.DTEMISSAO between '20180101' and '20180131'    
            and R.CDNOTAFISCAL is not null
            and R.INSTATUS in (0,1)    
    )
    SELECT T.CdGerente as Cod, 
           T.NomeGerente,
           count(*) as [Negócios], 
           dbo.FnFormatFloat(SUM(T.PMR) / SUM(T.VLRECEITA)) as PMR
      from T
      where T.PMR > 0 
      group by T.CdGerente, T.NomeGerente;
    Substitua NomeUsuario pelo nome da coluna que contém o nome do usuário.


    e-mail       José Diz     Belo Horizonte, MG - Brasil



    Obrigado José, sua ajuda foi fundamental.

    quinta-feira, 8 de fevereiro de 2018 19:25
  • Deleted
    quinta-feira, 8 de fevereiro de 2018 21:52
  • Com meu código acima ele me retorna esses resultados no PMR https://imgur.com/gSYCWXB

    Agora com seu código #2 e #3 me retorna esses resultados https://imgur.com/gSYCWXB 

    O que veio a me deixar um pouco confuso sobre o real resultado (risos).


    • Editado Bruno Xaavier sexta-feira, 9 de fevereiro de 2018 19:11
    sexta-feira, 9 de fevereiro de 2018 19:10
  • Deleted
    sexta-feira, 9 de fevereiro de 2018 19:32