Eu tenho uma tabela Units
onde tenho linhas ItemId
, ItemCreationDate
, ItemUnitsCount
. ItemId
é uma chave primária e eu tenho um índice clusterizado sobre ela.
Preciso produzir o seguinte: para cada dia preciso contar separadamente
- itens que foram criados naquele dia e têm zero
ItemUnitsCount
- itens que foram criados naquele dia e têm valor diferente de zero
ItemUnitsCount
e imprima a contagem e a data e em qualquer dia pode haver qualquer número de itens de ambos os tipos, talvez nenhum. Cada tipo de item deve ser relatado separadamente , então para qualquer dia eu não posso ter linhas, uma linha ou duas linhas.
Então criei a seguinte consulta:
(SELECT ItemCreationDate, COUNT(ItemId) AS ComputedCount, 1 AS CountType
FROM Items WHERE ItemUnitsCount<>0 GROUP BY ItemCreationDate )
UNION ALL
(SELECT ItemCreationDate, COUNT(ItemId) AS ComputedCount, 2 AS CountType
FROM Items WHERE ItemUnitsCount=0 GROUP BY ItemCreationDate )
e isso funciona bem, mas quando olho para o plano de execução real, vejo duas varreduras de índice clusterizado, uma das quais tem predicate ItemUnitsCount=0
e outra tem predicate ItemUnitsCount<>0
.
ItemUnitsCount
pode ser alterado várias vezes durante o tempo de vida da linha da tabela, portanto, prefiro não criar um índice para ele.
Existe uma maneira de criar uma consulta com o mesmo efeito que resulta em uma varredura de índice em vez de duas?
Agrupar por sua condição