Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Sumar total en una agrupación

Estas en el tema de Sumar total en una agrupación en el foro de SQL Server en Foros del Web. Buenos días amigos, tengo un problema con SQL server. A ver si alguno pudiese ayudarme: Esta es mi consulta @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original ...
  #1 (permalink)  
Antiguo 08/04/2015, 02:14
 
Fecha de Ingreso: abril-2015
Ubicación: Almería
Mensajes: 4
Antigüedad: 9 años
Puntos: 0
Sumar total en una agrupación

Buenos días amigos, tengo un problema con SQL server. A ver si alguno pudiese ayudarme:

Esta es mi consulta

Código SQL:
Ver original
  1. SELECT
  2. CR.Tipo [Tipo],
  3. ROUND(COALESCE(SUM(CR.[cantidad]) / (NULLIF(SUM(CR.valor), 0)), 0), 2) [Reultado],
  4.     FROM
  5.     (
  6.         SELECT
  7.             T2.TYPE [Tipo],
  8.             ISNULL((SELECT SUM((Quant1 - Quant2))
  9.                     FROM TQUANT A1
  10.                     WHERE (A1.Id = T0.Id)
  11.                     AND(A1.DATE <= GETDATE())
  12.                     ) * T0.VALUE, 0)
  13.                     [cantidad],
  14.         FROM TVALUES T0
  15.     ) AS CR
  16. GROUP BY CR.Tipo
  17. ORDER BY CR.Tipo
Lo que necesito ahora es obtener el total de "cantidad" (sin agrupar) para hacer calcular el total de todo, algo como ésto:
ROUND(COALESCE(SUM(CR.[cantidadTotal]) / (NULLIF(SUM(CR.valor), 0)), 0), 2) [Reultado total]
El problema es que al tener el group no consigo sacar la cantidad total sin quitar la agrupación, pero la necesito.

Gracias de antemano.
Saludos.

Última edición por gnzsoloyo; 08/04/2015 a las 05:56
  #2 (permalink)  
Antiguo 08/04/2015, 04:05
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Sumar total en una agrupación

Espero que te entendí: la cantidadTotal esta calculada dentro de la subconsulta (el mismo total a lo largo de todo el conjunto), y afuera de ella como Max(cantidadTotal) porque es obligatorio poner la en una función de agregado:

Código SQL:
Ver original
  1. SELECT  CR.Tipo [Tipo],
  2.         ROUND(COALESCE(SUM(CR.[cantidad]) / (NULLIF(SUM(CR.valor), 0)), 0), 2) [Reultado],
  3.         MAX([cantidadTotal]) [cantidadTotal]
  4. FROM    (SELECT T2.TYPE [Tipo],
  5.                 ISNULL((SELECT SUM((Quant1 - Quant2))
  6.                         FROM    TQUANT A1
  7.                         WHERE   A1.Id = T0.Id
  8.                                 AND A1.DATE <= GETDATE()) * T0.VALUE, 0)
  9.                 [cantidad],
  10.                 SUM([cantidad]) OVER() [cantidadTotal]
  11.         FROM    TVALUES T0) AS CR
  12. GROUP BY CR.Tipo
  13. ORDER BY CR.Tipo;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #3 (permalink)  
Antiguo 08/04/2015, 05:32
 
Fecha de Ingreso: abril-2015
Ubicación: Almería
Mensajes: 4
Antigüedad: 9 años
Puntos: 0
Respuesta: Sumar total en una agrupación

Cita:
Iniciado por GeriReshef Ver Mensaje
Espero que te entendí: la cantidadTotal esta calculada dentro de la subconsulta (el mismo total a lo largo de todo el conjunto), y afuera de ella como Max(cantidadTotal) porque es obligatorio poner la en una función de agregado:

Código SQL:
Ver original
  1. SELECT  CR.Tipo [Tipo],
  2.         ROUND(COALESCE(SUM(CR.[cantidad]) / (NULLIF(SUM(CR.valor), 0)), 0), 2) [Reultado],
  3.         MAX([cantidadTotal]) [cantidadTotal]
  4. FROM    (SELECT T2.TYPE [Tipo],
  5.                 ISNULL((SELECT SUM((Quant1 - Quant2))
  6.                         FROM    TQUANT A1
  7.                         WHERE   A1.Id = T0.Id
  8.                                 AND A1.DATE <= GETDATE()) * T0.VALUE, 0)
  9.                 [cantidad],
  10.                 SUM([cantidad]) OVER() [cantidadTotal]
  11.         FROM    TVALUES T0) AS CR
  12. GROUP BY CR.Tipo
  13. ORDER BY CR.Tipo;
Buenas GeriReshef, gracias por responder.
He probado lo del "Sum([cantidad]) Over() [cantidadTotal]" pero no me reconoce [cantidad] ya que está dentro de la misma consulta, igual me falta algo, pero creo que tiene sentido que no me deje acceder al campo.

Os doy mas detalles a ver si os ayuda:

La subconsulta devuelve datos como:
Tipo Cantidad
----------------------------------
AA 200
AB 100
AC 150
AA 400
AC 100
.
.
.
La consulta externa los agrupa por tipo, quedando algo como:

Tipo Cantidad
----------------------------------
AA 400
AB 100
AC 250
.
.
.

Lo que necesito es que "cantidadTotal" sea la suma de todos los tipos, en este caso:
400 + 100 + 250 = 750
El problema es que al tenerlo agrupado debería salirme en todas las filas la "cantidadTotal" igual, según entiendo claro.

Espero haberme explicado mejor, jeje.
Gracias.
  #4 (permalink)  
Antiguo 08/04/2015, 06:19
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Sumar total en una agrupación

Tenés razón, probá esta consulta:
Código SQL:
Ver original
  1. SELECT  CR.Tipo [Tipo],
  2.         ROUND(COALESCE(SUM(CR.[cantidad]) / (NULLIF(SUM(CR.valor), 0)), 0), 2) [Reultado],
  3.         SUM([cantidad]) [cantidadTotal]
  4. FROM    (SELECT T2.TYPE [Tipo],
  5.                 ISNULL((SELECT  SUM(Quant1 - Quant2)
  6.                                 FROM TQUANT A1
  7.                         WHERE   A1.Id=T0.Id
  8.                                 AND A1.Date<=GETDATE()))*T0.VALUE, 0) [cantidad]
  9.         FROM TVALUES T0) AS CR
  10. GROUP BY CR.Tipo
  11. ORDER BY CR.Tipo;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #5 (permalink)  
Antiguo 08/04/2015, 07:08
 
Fecha de Ingreso: abril-2015
Ubicación: Almería
Mensajes: 4
Antigüedad: 9 años
Puntos: 0
Respuesta: Sumar total en una agrupación

Cita:
Iniciado por GeriReshef Ver Mensaje
Tenés razón, probá esta consulta:
Código SQL:
Ver original
  1. SELECT  CR.Tipo [Tipo],
  2.         ROUND(COALESCE(SUM(CR.[cantidad]) / (NULLIF(SUM(CR.valor), 0)), 0), 2) [Reultado],
  3.         SUM([cantidad]) [cantidadTotal]
  4. FROM    (SELECT T2.TYPE [Tipo],
  5.                 ISNULL((SELECT  SUM(Quant1 - Quant2)
  6.                                 FROM TQUANT A1
  7.                         WHERE   A1.Id=T0.Id
  8.                                 AND A1.Date<=GETDATE()))*T0.VALUE, 0) [cantidad]
  9.         FROM TVALUES T0) AS CR
  10. GROUP BY CR.Tipo
  11. ORDER BY CR.Tipo;
Buenas, eso ya lo probé, pero la cantidadTotal se ve afectada por el group by y solo coge los totales por tipo. Yo necesito la suma total de todos los tipos.

Gracias.
  #6 (permalink)  
Antiguo 08/04/2015, 07:35
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Sumar total en una agrupación

Podrias poner un ejemplo de tus datos y que necesitas? asi seria mas facil entender cual es tu problematica......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 08/04/2015, 08:03
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Sumar total en una agrupación

¿Así?
Código SQL:
Ver original
  1. SELECT  CR.Tipo [Tipo],
  2.         ROUND(COALESCE(SUM(CR.[cantidad]) / (NULLIF(SUM(CR.valor), 0)), 0), 2) [Reultado],
  3.         SUM([cantidad]) OVER() [cantidadTotal]
  4. FROM    (SELECT T2.TYPE [Tipo],
  5.                 ISNULL((SELECT  SUM(Quant1 - Quant2)
  6.                                 FROM TQUANT A1
  7.                         WHERE   A1.Id=T0.Id
  8.                                 AND A1.Date<=GETDATE()))*T0.VALUE, 0) [cantidad]
  9.         FROM TVALUES T0) AS CR
  10. GROUP BY CR.Tipo
  11. ORDER BY CR.Tipo;
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #8 (permalink)  
Antiguo 09/04/2015, 02:47
 
Fecha de Ingreso: abril-2015
Ubicación: Almería
Mensajes: 4
Antigüedad: 9 años
Puntos: 0
Respuesta: Sumar total en una agrupación

Cita:
Iniciado por GeriReshef Ver Mensaje
¿Así?
Código SQL:
Ver original
  1. SELECT  CR.Tipo [Tipo],
  2.         ROUND(COALESCE(SUM(CR.[cantidad]) / (NULLIF(SUM(CR.valor), 0)), 0), 2) [Reultado],
  3.         SUM([cantidad]) OVER() [cantidadTotal]
  4. FROM    (SELECT T2.TYPE [Tipo],
  5.                 ISNULL((SELECT  SUM(Quant1 - Quant2)
  6.                                 FROM TQUANT A1
  7.                         WHERE   A1.Id=T0.Id
  8.                                 AND A1.Date<=GETDATE()))*T0.VALUE, 0) [cantidad]
  9.         FROM TVALUES T0) AS CR
  10. GROUP BY CR.Tipo
  11. ORDER BY CR.Tipo;

Lo he conseguido!! le he puesto en el group:
GROUP BY CR.Tipo WITH ROLLUP
Esto me genera una línea adicional con los totales de todas las columnas.

GeriReshef, he probado lo tuyo, me funciona también, pero tengo que introducir el campo "cantidad" en el group y me varía la agrupación. Gracias igualmente.

Mil gracias a todos.

Etiquetas: bases-de-datos-general, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:14.