Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wawaanjo

Top 10 por produto e tipo de Erro em uma única query

Recommended Posts

Em minha query estou buscando os campos (de uma única tabela) que são:

Produto,

Tipo_Erro --- (EC, ENC) somente esses dois valores

Descrição, -- Descrição do erro

Quantidade -- Quantas vezes esse erro foi cometido para determinado produto

 

Preciso buscar somente os 10 erros mais cometidos por produto e por tipo de erro.

 

Exemplo:

Produto A teve 13 erros EC e 22 erros ENC

Produto B teve 32 erros EC e 19 erros ENC

 

-> Para o produto A tem que trazer somente os 10 erros EC mais cometidos (vou ter isso na coluna Qtde)

e os 10 erros ENC mais cometidos, desprezando os demais

 

Da mesma forma, para o produto B, somente os 10 erros EC mais cometidos e os 10 erros ENC mais cometidos.

 

 

Como posso estar fazendo isso? Colocando somente top vai fazer os 10 primeiros de tudo, mas eu preciso os 10 mais cometidos EC e ENC e por produto. (por produto e por tipo)

 

Tentei da seguinte forma:

SELECT ANO,
MES,
PRODUTO,
TIPO_ERRO,
DESCRICAO,
QTDE
FROM (
SELECT ANO,
MES,
PRODUTO,
TIPO_ERRO,
DESCRICAO,
COUNT(*) QTDE
FROM TABELA
group by MES, NOME_FORMULARIO, ANO, NOME_SESSAO, ITEM_PONTUADO
ORDER BY 1,2,3,4,6 DESC
)
ROW_NUMBER() OVER (PARTITION BY PRODUTO, TIPO_ERRO ORDER BY QTDE DESC)
;

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente da seguinte forma :

SELECT RN,
ANO,
       MES,
       PRODUTO,
       TIPO_ERRO,
       DESCRICAO,
       QTDE
FROM (
      SELECT  ANO,
              MES,
              PRODUTO,
              TIPO_ERRO,
              DESCRICAO,
              COUNT(*) QTDE,
ROW_NUMBER() OVER (PARTITION BY PRODUTO, TIPO_ERRO ORDER BY QTDE DESC) AS RN
      FROM TABELA
      group by MES, NOME_FORMULARIO, ANO, NOME_SESSAO, ITEM_PONTUADO
      ORDER BY 1,2,3,4,6 DESC
      ) TABELA_ORDENADO_POR_NR
WHERE RN <= 5

Desta forma estou usando o row_number para enumerar de acordo com o agrupamento, e pensando da forma que você quer teríamos:

 

 

-> Para o produto A tem que trazer somente os 10 erros EC mais cometidos (vou ter isso na coluna Qtde)

e os 10 erros ENC mais cometidos, desprezando os demais

 

Da mesma forma, para o produto B, somente os 10 erros EC mais cometidos e os 10 erros ENC mais cometidos.

 

CONSULTA NORMAL

 

RN | PRODUTO | TIPO_ERRO |...

1 | A | EC ...

2 | A | EC ...

3 | A | EC ...

4 | A | EC ...

5 | A | EC ...

6 | A | EC ...

7 | A | EC ...

1 | A | ENC ...

2 | A | ENC ...

3 | A | ENC ...

4 | A | ENC ...

5 | A | ENC ...

6 | A | ENC ...

7 | A | ENC ...

8 | A | ENC ...

9 | A | ENC ...

1 | B | EC ...

2 | B | EC ...

3 | B | EC ...

4 | B | EC ...

5 | B | EC ...

6 | B | EC ...

1 | B | ENC ...

2 | B | ENC ...

3 | B | ENC ...

4 | B | ENC ...

5 | B | ENC ...

6 | B | ENC ...

7 | B | ENC ...

 

CONSULTA QUE TE ENVIEI

 

RN | PRODUTO | TIPO_ERRO |...

1 | A | EC ...

2 | A | EC ...

3 | A | EC ...

4 | A | EC ...

5 | A | EC ...

1 | A | ENC ...

2 | A | ENC ...

3 | A | ENC ...

4 | A | ENC ...

5 | A | ENC ...

1 | B | EC ...

2 | B | EC ...

3 | B | EC ...

4 | B | EC ...

5 | B | EC ...

1 | B | ENC ...

2 | B | ENC ...

3 | B | ENC ...

4 | B | ENC ...

5 | B | ENC ...

 


ROW_NUMBER() OVER (PARTITION BY PRODUTO, TIPO_ERRO ORDER BY QTDE DESC) AS RN

Essa consulta vai enumerar os registros de acordo com a partition, nesse caso, por produto e tipo_erro.


WHERE RN <= 5

E esse where vai se encarregar de retornar apenas os 5 primeiros registros da row_number, no seu caso, os 10 primeiros registros.

 

Eu não cheguei a testar, mas assim que chegar do trabalho eu testo no SQL Server. Eu fiz uma consulta no Oracle desta forma para resolver um problema exatamente igual ao seu e funcionou perfeitamente, então, veja se no SQL Server é essa mesma sintaxe.

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.