Anteriormente, discutimos o conceito de relatório Top N e Bottom N no SQL Server. No entanto, existem algumas considerações adicionais que não abordamos naquela postagem do blog. Neste artigo, abordaremos essas preocupações e forneceremos uma solução para o problema de valores duplicados no ponto de corte.
Vamos supor que queremos agrupar os 5 melhores vendedores com base no valor de suas vendas. Em nossa postagem anterior do blog, demonstramos como usar os filtros Top N e Bottom N em grupos. No entanto, surge um problema quando existem valores duplicados no ponto de corte. Por exemplo, se três funcionários empatam na quinta posição, usando a técnica da postagem anterior do blog resultaria em mais de 5 pessoas sendo exibidas no grupo Top N, e essas mesmas pessoas também seriam exibidas no grupo Bottom N.
Então, como podemos resolver isso? Precisamos de uma abordagem diferente. Em vez de depender apenas dos filtros Top N e Bottom N, precisamos encontrar o valor de corte e dividir o grupo superior do grupo inferior com base nesse valor.
Aqui está uma tabela de exemplo que usaremos para nosso relatório:
RowNum | Nome | Valor |
---|---|---|
1 | John | 1000 |
2 | Jane | 900 |
3 | Mike | 800 |
4 | Emily | 700 |
5 | David | 600 |
6 | Sarah | 600 |
Se definirmos o filtro no relatório para mostrar os 5 melhores vendedores, na verdade obteremos 6 linhas no grupo superior devido ao empate entre David e Sarah. O método Bottom N que discutimos na postagem anterior do blog falhará nesse cenário porque o grupo inferior não terá conhecimento das linhas extras no grupo superior, fazendo com que a linha 6 apareça em ambos os grupos.
Uma abordagem melhor para obter a divisão de grupos Top N e Bottom N é encontrar o valor de corte e filtrar os grupos com base nele. Aqui está a consulta principal que recupera os dados a serem exibidos na tabela:
SELECT RowNum, Nome, Valor
FROM TopN
Em seguida, precisamos criar um novo conjunto de dados com uma consulta que se parece com isso:
WITH O AS (
SELECT TOP (@N) t.RowNum, t.Valor, t.Nome
FROM TopN t
ORDER BY Valor DESC
)
SELECT TOP 1 Valor
FROM O
ORDER BY Valor
Neste exemplo, nomeamos esse conjunto de dados como “MinTopAmount”. A consulta usa uma Expressão de Tabela Comum (CTE) para recuperar os N maiores valores, onde N é um parâmetro no relatório. Você também pode codificar esse valor se desejar. A consulta externa, em seguida, seleciona o valor mais baixo da consulta anterior, fornecendo-nos o valor de corte a ser usado no grupo Top N.
Agora, podemos configurar os filtros nos grupos para filtrar com base no valor em vez de usar os filtros Top ou Bottom. Esses grupos são adjacentes em uma única tabela. A soma do valor do conjunto de dados novo, “MinTopAmount” neste exemplo, não deve somar nada porque a consulta retorna apenas uma linha devido à cláusula “TOP 1” na CTE. O grupo inferior terá o mesmo filtro exato, exceto que usará “menor que” em vez de “maior que ou igual a”.
Com N definido como 5, os grupos serão divididos com base no valor na quinta posição. Se houver um empate, não importará. No relatório resultante, você pode ver o grupo inferior destacado em azul. Mesmo que tenhamos selecionado os 5 melhores vendedores, obtemos 6 linhas no grupo superior devido ao empate, enquanto todos os outros estão no grupo inferior.
Se encontrar algum problema ou tiver mais perguntas, por favor, nos avise. Estamos aqui para ajudar!