Estoy tratando de refinar una consulta SQL para que mis informes se vean mejor. Mi consulta lee los datos de una tabla, agrupa por unas pocas columnas y calcula algunos campos agregados (recuentos y sumas).Cómo generar resultados agregados "vacíos" en SQL
SELECT A, B, C, COUNT(*), SUM(D) FROM T
GROUP BY A, B, C
ORDER BY A, B, C
Ahora, vamos a suponer columnas B y C son algunas cadenas constantes definidas, por ejemplo, B puede ser 'B1'
o 'B2'
, C puede ser 'C1'
o 'C2'
. Por lo tanto, un ejemplo de resultados es:
A | B | C | COUNT(*) | SUM(D)
--------------------------------
A1 | B1 | C1 | 34 | 1752
A1 | B1 | C2 | 4 | 183
A1 | B2 | C1 | 199 | 8926
A1 | B2 | C2 | 56 | 2511
A2 | B1 | C2 | 6 | 89
A2 | B2 | C2 | 12 | 231
A3 | B1 | C1 | 89 | 552
...
Como se puede ver, por 'A1'
tengo todas las combinaciones posibles de cuatro (B, C), pero eso no es cierto para 'A2'
. Mi pregunta es: ¿cómo puedo generar también filas de resumen para la combinación (B, C) que no están presentes, de hecho, en la tabla dada? Es decir, ¿cómo puedo imprimir, por ejemplo, también estas filas:
A | B | C | COUNT(*) | SUM(D)
--------------------------------
A2 | B1 | C1 | 0 | 0
A2 | B2 | C1 | 0 | 0
La única solución que puedo ver es crear algunas tablas auxiliarity con todos (B, C) los valores y luego hacer un RIGHT OUTER JOIN con esa mesa auxiliar. Pero estoy buscando una manera más limpia ...
Gracias a todos.
¿Qué estás usando mssql, oracel, mysql? – Arion
Oracle. Pero la consulta está escrita, de momento, de manera estándar (también se ejecuta en MySQL, tenemos una copia MySQL de la base de datos sin motivo relevante para la pregunta). –
Tal vez [esto] (http://www.techrepublic.com/article/group-by-grouping-sets-for-custom-rollups-in-oracle/6134424) ayude. Los conjuntos de agrupamiento están disponibles en SQL Server y Oracle. No estoy seguro acerca de MySQL. –