Existe uma maneira de avaliar os dados em uma tabela para derivar se em um conjunto de ProductIDs um PRODUCTID passou ou falhou? Aqui está um exemplo dos meus dados:
DECLARE @example TABLE (ID INT NOT NULL, PRODUCTID INT, PASSED BIT, LEVEL INT, CREATEDATE DATETIME, PRIMARY KEY (ID))
INSERT INTO @example VALUES
( 1, 100, 1, 1, '2016-01-10 07:35:02.123' )
,( 2, 100, 1, 1, '2016-01-10 07:35:02.123' )
,( 3, 100, 1, 1, '2016-01-10 07:35:02.123' )
,( 4, 100, 1, 1, '2016-01-10 07:35:02.123' )
,( 5, 101, 1, 1, '2016-01-10 07:35:02.123' )
,( 6, 102, 0, 1, '2016-01-10 07:35:02.123' )
,( 7, 102, 1, 2, '2016-01-10 07:35:02.123' )
,( 8, 103, 1, 1, '2016-01-10 10:35:02.123' )
,( 9, 103, 1, 2, '2016-01-10 09:35:02.123' )
,( 10, 103, 1, 2, '2016-01-10 08:35:02.123' )
,( 11, 103, 1, 3, '2016-01-10 07:35:02.123' )
É possível estruturar uma consulta que retorne:
PRODUCTID ISPASSED
100 0
101 0
102 0
103 1
As condições são: 2 APROVADOS para 2 NÍVEIS diferentes para um determinado PRODUCTID.
- 100 é um 0 porque todos os 4 registros são para NÍVEL 1
- 101 é um 0 porque há apenas 1 PASS e para apenas 1 NÍVEL
- 102 é um 0 porque um registro PASSOU e o outro falhou
- 103 é 1 porque existem 2 registros PASSED para NÍVEIS diferentes.
Muito obrigado!
EDITAR:
Eu criei esta consulta, mas ela é curta porque só consigo qualificar a primeira parte dos requisitos:
WITH cte(PRODUCTID, ISPASSED) AS
(
SELECT PRODUCTID, CASE WHEN SUM(CONVERT(INT, PASSED)) = 2 THEN 1 ELSE 0 END AS ISPASSED
FROM (SELECT PRODUCTID, RowNumber = ROW_NUMBER() OVER(PARTITION BY PRODUCTID ORDER BY CREATEDATE DESC), LEVEL, PASSED
FROM @example
GROUP BY PRODUCTID, LEVEL, CREATEDATE, PASSED) as agg
WHERE RowNumber <=2
GROUP BY PRODUCTID
)
select * from cte
Como você deseja contar valores diferentes em um conjunto que pode conter valores idênticos, eu diria que
COUNT(DISTINCT ...)
é a ferramenta perfeita para usar. Por exemplo, o seguinte contará níveis distintos por produto:Esta será a saída para o seu exemplo:
Agora, como você pode contar apenas os valores distintos que correspondem a uma condição específica? A resposta é, usando agregação condicional, ou seja, uma que usa uma expressão CASE como argumento da função de agregação. Portanto, para contar apenas os níveis aprovados distintos , você pode usar uma consulta como esta:
E os resultados serão agora
Os números parecem corretos agora, então como você pode transformar esses
1
,3
em0
,1
? Por que, usando outra expressão CASE, é claro:Agora você pode aproveitar a saída esperada de
Isso lhe dará a resposta desejada com base nos dados de exemplo que você forneceu. Você não respondeu à minha pergunta sobre o número de níveis, então isso pressupõe que não haja mais de 3 níveis.
Isso é o que eu entendo... Não tenho certeza se isso cobre todos os seus casos...
Avise-me se houver algum caso específico que não esteja coberto.
reeditado: só notei
Isso parece estar funcionando: