Básicamente estoy tratando de obtener un recuento distinto dentro de este resultado en cubos. Pero, desafortunadamente, no puede usar Count (distinct (Field)) con cubos y rollup (as stated here)SQL Sever Obteniendo una cuenta diferente usando "Agrupar por ... Con cubo"
Esto es lo que parecen los datos. (Esto es sólo un ejemplo sencillo que se puede esperar duplicados en los datos)
Category1 Category2 ItemId
a b 1
a b 1
a a 1
a a 2
a c 1
a b 2
a b 3
a c 2
a a 1
a a 3
a c 4
Esto es lo que me gustaría hacer, pero no funciona.
SELECT
Category1,
Category2,
Count(Distinct(ItemId))
FROM ItemList IL
GROUP BY
Category1,
Category2
WITH CUBE
sé que puedo hacer un sub seleccionar como este para obtener los resultados que quiero:
SELECT
*,
(SELECT
Count(Distinct(ItemId))
FROM ItemList IL2
WHERE
(Q1.Category1 IS NULL OR Q1.Category1 IS NOT NULL AND Q1.Category1 = IL2.Category1)
AND
(Q1.Category2 IS NULL OR Q1.Category2 IS NOT NULL AND Q1.Category2 = IL2.Category2))
AS DistinctCountOfItems
FROM (SELECT
Category1,
Category2
FROM ItemList IL
GROUP BY
Category1,
Category2
WITH CUBE) Q1
Pero esto corre lento cuando el conjunto de resultados es grande debido a la sub-select. ¿Hay alguna otra forma de obtener un Recuento Distinto a partir de un resultado en cubos?
Este es el resultado que quiero ver
Category1 Category2 DistinctCountOfItems
a a 3
a b 3
a c 3
a NULL 4
NULL NULL 4
NULL a 3
NULL b 3
NULL c 3
@ chezy525 .... Buen enfoque ... me gusta. Definitivamente es más eficiente que los sindicatos. todavía un poco más desordenado de lo que me gusta, pero funciona. –
Gracias! ¡Esta fue una diversión divertida para mi viernes! Creo que cualquier solución va a ser "más desordenada de lo que debería ser" sin el agregado de soporte agregado ... – chezy525
Su última opción es la misma con la que finalmente termino, es la más elegante, y está llegando a las mesas lo menos posible veces para recuperar el resultado. Por lo que puedo decir de mis planes de ejecución, un índice en Category1, Category2, ItemID haría la consulta lo más rápido posible. – cairnz