Inquiridor
Dúvida com agrupamento

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.VendNomeAlguém tem alguma idéia?
Todas as Respostas
-
-
-
-
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
-
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- Editado Lukas de Castro Ruocco 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.
-
-
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
-
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 -
-
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
-
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)
-
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 -
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
-
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á. :)
-
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- Editado Lukas de Castro Ruocco Baldan quarta-feira, 22 de agosto de 2012 19:16
-