Tengo una situación complicada al tratar de obtener información de múltiples consultas en una sola fila.¿Cómo combino dos consultas (unión de todo) en una fila?
Considérese la siguiente tabla:
CpuUage:
Time time
Group char(10)
Subsys char(4)
Jobs int
Cpu int
que sostiene los siguientes datos:
Time Group Subsys Jobs Cpu
----- ------ ------ ---- ---
00:00 group1 NORM 1 101 (grp1-norm) A1
01:00 group1 SYS7 3 102 (grp1-sys7) A2
01:00 group1 NORM 5 104 (grp1-norm) A1
02:00 group1 NORM 7 108 (grp1-norm) A1
02:00 group2 NORM 9 116 (grp2-norm) B1
02:00 group3 SYS7 11 132 (grp3-sys7) C2
03:00 group1 SYS7 13 164 (grp1-sys7) A2
03:00 group1 IGNR 99 228 (grp1-ignr) --
Los marcadores de la derecha (por ejemplo, A1
) son las secciones en el informe a continuación que cada fila se supone afectar.
Necesito una consulta que pueda devolver una sola fila para cada grupo de usuarios, pero con una condición. Los valores para Jobs
y Cpu
tienen que ir a diferentes columnas dependiendo de la ID del subsistema y solo me interesan los ID de subsistema SYS7
y NORM
.
Así, por ejemplo, necesitamos la siguiente (los A/B/1/2
bits son una referencia cruzada de nuevo a las filas anteriores):
<------ 1 ------> <------ 2 ------>
Group NormJobs NormCpu Sys7Jobs Sys7Cpu
------ -------- ------- -------- -------
A: group1 13 313 16 266
B: group2 9 116 0 0
C: group3 0 0 11 164
Nuestra solución de informes de edad podría ejecutar varias consultas (con un union all
), entonces post-proceso de las filas de combinar los que tienen el mismo nombre de grupo, de modo que:
Group NormJobs NormCpu Sys7Jobs Sys7Cpu
------ -------- ------- -------- -------
group1 13 313 0 0
group1 0 0 16 266
se fusionaron juntos, a lo largo de las líneas de:
select groupname, sum(jobs), sum(cpu), 0, 0 from tbl
where subsys = 'NORM'
group by groupname
union all
select groupname, 0, 0, sum(jobs), sum(cpu) from tbl
where subsys = 'SYS7'
group by groupname
Lamentablemente, nuestra nueva solución no permite el postprocesamiento y todo tiene que hacerse en la consulta SQL.
Teniendo en cuenta que puede haber grupos con filas SYS7
, filas NORM
, ambos o ninguno, ¿cuál es la mejor manera de lograr esto?
Pensé en sub-consultar la tabla desde dentro de una selección externa, pero eso puede tener ramificaciones de rendimiento.
Además, eso sería un dolor, ya que tendría que hacer la consulta externa incluyen norma y SYS7 subsistemas continuación, ejecute una subconsulta para cada campo (no puedo realizar la consulta externa sólo para puestos de trabajo desde NORM
la presencia de un grupo con solo SYS7
filas no se detectaría de esa manera).
¿Pueden ustedes tejer cualquiera de sus magias izquierda-medio-fuera-fuera de juego para crear una solución viable?
Preferiría una solución independiente del proveedor pero, si debe ir a un proveedor específico, la plataforma es DB2. Aún así, otras plataformas pueden al menos darme una idea de qué probar, así que estoy feliz de verlas.
Si lo hace la prueba y comparar soluciones, estaría interesado en ver Los resultados. Instintivamente, espero que cualquier solución para de alguna forma realizar la tarea de la declaración CASE. Es decir. "Si groupname = g y subsys = s, entonces agregue a aggregate (g, s)". Espero más de una diferencia en términos de recuperación de datos. Sin embargo, estoy abierto a la posibilidad de que un SGBD pueda aprovechar la información del índice para reducir el número de comparaciones necesarias al agregar ciertos grupos. Sugiero que incluya en sus pruebas las permutaciones donde su orden físico de clasificación (índice agrupado) es (subsistemas, nombre de grupo). –