none
Dúvida com agrupamento RRS feed

  • Pergunta

  • Fala ae galera.

    To com um probleminha que me deixou meio cego, que é o seguinte:

    Um pouco diferente do print abaixo (que é como está meu relatório atualmente), eu gostaria de agrupar o NOME CLIENTE, para conseguir, com NOME CLIENTE repetido, somar apenas 1 em QTD. CLIENTE. Já tentei distinct, mas não tive o resultado esperado (nada aconteceu).

    Em contra-partida, eu gostaria que, apesar de o NOME CLIENTE se agrupasse (valores iguais), o VALOR fosse somado, e apresentado nesse NOME CLIENTE resultante do agrupamento.

    Ficaria mais ou menos assim:

    VENDEDOR VALOR QTD. CLIENTE CLIENTE

    BRUNO LEONARDO R$ 19,80 3 ELBER GEOVANE GRANJA SANTOS

    BRUNO LEONARDO R$ 2058,50 FRANCISCO DE ALMEIDA SOUZA

    BRUNO LEONARDO R$ 900,44 ANTONIO MYCHEL BRITO JORGE

    Segue abaixo minha query atual, que funciona da forma do print acima:

    Select distinct P.EmpCod, P.EntCod, P.PedVendaNum, P.PedVendaData, P.PedVendaDataENTREGA, P.PedVendaStatDescr, v.VendCod, v.VendNome,p.PedVendaValTotal, P.PedVendaEntNomeDiv,
    (select distinct count(Z.PedVendaEntNomeDiv) media from PED_VENDA Z
    INNER JOIN VEND_PED_VENDA ZP
    on Z.EMPCOD = ZP.EMPCOD
     and z.PEDVENDADATA >= :Data_inicial
     and     z.PEDVENDADATA <= :Data_final
    and    Z.EmpCod = 9
    and    Z.PedVendaNum = ZP.PedVendaNum
    and    Z.PedVendaStatDescr <> 'NF cancelada'
    where ZP.VendCod = VP.VendCod)

    From   PED_VENDA P With(NoLock), VEND_PED_VENDA VP With(Nolock), vendedor v with(nolock)

    Where  P.EMPCOD = VP.EMPCOD
    and    P.EmpCod = 9
    and    P.PedVendaNum = VP.PedVendaNum
    and    p.PedVendaStatDescr <> 'NF cancelada'
    and    v.VendCod = vp.VendCod
     and P.PEDVENDADATA >= :Data_inicial
     and     P.PEDVENDADATA <= :Data_final

    group by P.EmpCod, P.EntCod, P.PedVendaNum, P.PedVendaData, P.PedVendaDataENTREGA, P.PedVendaStatDescr, V.VendCod, v.VendNome,p.PedVendaValTotal, vp.VendCod, P.PedVendaEntNomeDiv

    order by v.VendNome

    Alguém tem alguma idéia?

    terça-feira, 21 de agosto de 2012 13:52

Todas as Respostas

  • Ola Danilo,

    Tente fazer um count distinct

    select count(distinct Z.PedVendaEntNomeDiv) media ...



    [ ]´s,
    Lukas Baldan

    terça-feira, 21 de agosto de 2012 14:44
  • Ola Danilo,

    Tente fazer um count distinct

    select count(distinct Z.PedVendaEntNomeDiv) media ...



    [ ]´s,
    Lukas Baldan

    Fala ae Lukas! Sempre você me ajudando :D

    Tentei alterar conforme você disse acima, mas nada alterou...

    Mais alguma idéia?

    terça-feira, 21 de agosto de 2012 14:51
  • Danilo,

    qual o campo que representa o nome do cliente?

    como ficou o codígo que você alterou?

     


    [ ]´s,
    Lukas Baldan

    terça-feira, 21 de agosto de 2012 15:05
  • Lukas, o campo que representa o nome do cliente é o PedVendaEntNomeDiv.

    O código alterado ficou o seguinte:

    Select distinct P.EmpCod, P.EntCod, P.PedVendaNum, P.PedVendaData, P.PedVendaDataENTREGA, P.PedVendaStatDescr, v.VendCod, v.VendNome,p.PedVendaValTotal, P.PedVendaEntNomeDiv,
    (select count(distinct Z.PedVendaEntNomeDiv) media from PED_VENDA Z
    INNER JOIN VEND_PED_VENDA ZP
    on Z.EMPCOD = ZP.EMPCOD
     and z.PEDVENDADATA >= :Data_inicial
     and     z.PEDVENDADATA <= :Data_final
    and    Z.EmpCod = 9
    and    Z.PedVendaNum = ZP.PedVendaNum
    and    Z.PedVendaStatDescr <> 'NF cancelada'
    where ZP.VendCod = VP.VendCod)

    From   PED_VENDA P With(NoLock), VEND_PED_VENDA VP With(Nolock), vendedor v with(nolock)

    Where  P.EMPCOD = VP.EMPCOD
    and    P.EmpCod = 9
    and    P.PedVendaNum = VP.PedVendaNum
    and    p.PedVendaStatDescr <> 'NF cancelada'
    and    v.VendCod = vp.VendCod
     and P.PEDVENDADATA >= :Data_inicial
     and     P.PEDVENDADATA <= :Data_final

    group by P.EmpCod, P.EntCod, P.PedVendaNum, P.PedVendaData, P.PedVendaDataENTREGA, P.PedVendaStatDescr, V.VendCod, v.VendNome,p.PedVendaValTotal, vp.VendCod, P.PedVendaEntNomeDiv


    order by v.VendNome

    terça-feira, 21 de agosto de 2012 16:12
  • Ok,

    você pega o valor do campo "QTD. Cliente" direto da query(campo media) ou você faz alguma modificação no campo para exibir no relatório? 


    [ ]´s,
    Lukas Baldan


    terça-feira, 21 de agosto de 2012 16:54
  • Eu jogo direto. A única alteração que eu faço é marcar uma caixa nas opções do campo, que 'escondem' os valores repetidos, por isso os valores do campo só aparecem uma vez para cada vendedor. Se estivesse desmarcada essa caixa, apareceria a QTD.CLIENTE em cada linha, o que eu julguei desnecessário. Só questão de estética.
    terça-feira, 21 de agosto de 2012 16:59
  • Danilo,

    neste caso o script que você postou com o distinct já devia funcionar,

    ele retorna exatamente o mesmo resultado?

    tem como você mandar um exemplo dos dados ?


    [ ]´s,
    Lukas Baldan

    terça-feira, 21 de agosto de 2012 17:35
  • Sim, mesmo resultado.

    O exemplo dos dados está na minha primeira postagem do tópico, no print. Não importa se eu coloco o distinct antes ou depois, conforme abaixo, ele apresenta aquele resultado da primeira postagem.

    select count(distinct Z.PedVendaEntNomeDiv) media ou

    select distinct count(Z.PedVendaEntNomeDiv) media
    terça-feira, 21 de agosto de 2012 17:46
  • Qual o resultado desse script,

    select distinct Z.PedVendaEntNomeDiv
    from PED_VENDA Z
    INNER JOIN VEND_PED_VENDA ZP
     on Z.EMPCOD = ZP.EMPCOD
     and  z.PEDVENDADATA >= :Data_inicial
     and     z.PEDVENDADATA <= :Data_final
     and    Z.EmpCod = 9
     and    Z.PedVendaNum = ZP.PedVendaNum
     and    Z.PedVendaStatDescr <> 'NF cancelada'
    INNER JOIN vendedor ZV
    on ZP.VendCod = ZV.VendCod
    WHERE ZV.VendNome = 'BRUNO LEONARDO'


    [ ]´s,
    Lukas Baldan

    terça-feira, 21 de agosto de 2012 18:44
  • Lukas, deu um monte de erro.
    terça-feira, 21 de agosto de 2012 19:44
  • Você pode fazer esse agrupamento de forma muito mais fácil direto no seu relatório do reporting services.

    Basta criar o primeiro grupo de linha pelo vendedor, e o segundo pelo cliente. Usando a expressão =sum(Fields!Valor.Value) dentro do grupo e usando o =CountDistinct(Fields!Client.Value) no grupo de vendedor você deve ter o resultado esperado.

    Att

    Boreki


    Boreki[MSFT] - SQL Server Reporting Services

    • Sugerido como Resposta Rodrigo Ataíde quarta-feira, 22 de agosto de 2012 00:48
    • Não Sugerido como Resposta DaniloRodowest quarta-feira, 22 de agosto de 2012 12:06
    terça-feira, 21 de agosto de 2012 23:24
  • Você pode fazer esse agrupamento de forma muito mais fácil direto no seu relatório do reporting services.

    Basta criar o primeiro grupo de linha pelo vendedor, e o segundo pelo cliente. Usando a expressão =sum(Fields!Valor.Value) dentro do grupo e usando o =CountDistinct(Fields!Client.Value) no grupo de vendedor você deve ter o resultado esperado.

    Att

    Boreki


    Boreki[MSFT] - SQL Server Reporting Services

    Boreki, eu não entendi essa estrutura (Fields!Client.Value) Você poderia dar um exemplo utilizando minha query?

    (Desculpa. Trabalho com SQL há pouco tempo, então algumas coisas que podem ser básicas para vocês, são mistérios para mim ainda. Estou me esforçando. rs)

    quarta-feira, 22 de agosto de 2012 11:52
  • Danilo,

    o Boreki quis dizer para você agrupar no relatório mesmo e não na query, é uma boa solução já que estamos quebrando a cabeça com a query rs.

    no seu caso você teria que agrupar pelo nome do do vendedor e fazer o count distinct do cliente.

    de uma olhada neste link:

    http://msdn.microsoft.com/pt-br/library/ms170712(v=sql.105)


    [ ]´s,
    Lukas Baldan

    quarta-feira, 22 de agosto de 2012 16:07
  • Isso, como o Lukas postou, o =Fields!Field.Value é o formato que o relatório (ssrs) usa para fazer referencia a campos da query. Ao desenvolver relatórios eu considero uma boa prática deixar as transformações de dados para o relatório e manter as queries simples.

    Att

    Boreki


    Boreki[MSFT] - SQL Server Reporting Services

    quarta-feira, 22 de agosto de 2012 16:14
  • Ae rapaziada, depois de bater muito com a cara na parede, quase consegui o que queria.

    Com a seguinte query:

    Select distinct P.EmpCod,
    P.EntCod,
    v.VendCod,
    sum(p.PedVendaValTotal) AS Total, v.VendNome,
    count(distinct p.PedVendaEntNomeDiv) QuantidadeVendaTotal
    From   PED_VENDA P With(NoLock), VEND_PED_VENDA VP With(Nolock), vendedor v with(nolock)
    Where  P.EMPCOD = VP.EMPCOD
    and    P.EmpCod = 9
    and    P.PedVendaNum = VP.PedVendaNum
    and    p.PedVendaStatDescr <> 'NF cancelada'
    and    v.VendCod = vp.VendCod
    and P.PEDVENDADATA >= :Data_inicial
    and     P.PEDVENDADATA <= :Data_final
    group by P.EmpCod, P.EntCod, v.VendCod, v.VendNome
    order by v.VendNome

    consegui o seguinte resultado:

    O problema, é que eu queria ordenar os dados pelo sum(p.PedVendaValTotal), e quando coloco ele no Order by, substituindo o v.VendNome

    (order by sum(p.PedVendaValTotal), ele me retorna o seguinte resultado:

    Alguém tem alguma ideia de onde está a diferença? Até onde aprendi de SQL (e não foi muito rs), o order by não altera nada no relacionamento, então creio que não seja isso.

    Valeu, desde já. :)

    quarta-feira, 22 de agosto de 2012 19:04
  • Danilo,

    realmente não altera, como fico o seu script final??

    tente assim

    Select distinct P.EmpCod,
    P.EntCod,
    v.VendCod,
    sum(p.PedVendaValTotal) AS Total, v.VendNome,
    count(distinct p.PedVendaEntNomeDiv) QuantidadeVendaTotal
    From   PED_VENDA P With(NoLock), VEND_PED_VENDA VP With(Nolock), vendedor v with(nolock)
    Where  P.EMPCOD = VP.EMPCOD
    and    P.EmpCod = 9
    and    P.PedVendaNum = VP.PedVendaNum
    and    p.PedVendaStatDescr <> 'NF cancelada'
    and    v.VendCod = vp.VendCod
    and P.PEDVENDADATA >= :Data_inicial
    and     P.PEDVENDADATA <= :Data_final
    group by P.EmpCod, P.EntCod, v.VendCod, v.VendNome
    order by Total


    [ ]´s,
    Lukas Baldan


    quarta-feira, 22 de agosto de 2012 19:15
  • Lukas, tentei sua query, e o resultado foi o mesmo.

    Meu script final, onde deu o erro (segundo print), ficou idêntico ao primeiro, sendo que eu só troquei o order by, de v.VendNome para TOTAL.

    Estou desorientado :\

    quarta-feira, 22 de agosto de 2012 19:20