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

Como saco un promedio Average de varias columnas

Estas en el tema de Como saco un promedio Average de varias columnas en el foro de SQL Server en Foros del Web. Hola, Quiero sacar el promedio de "varias columnas de una linea" El problema es que no se como hacerlo, ya que la funcion AVG solo ...
  #1 (permalink)  
Antiguo 11/03/2013, 14:21
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 17 años
Puntos: 2
Como saco un promedio Average de varias columnas

Hola,
Quiero sacar el promedio de "varias columnas de una linea" El problema es que no se como hacerlo, ya que la funcion AVG solo acepta un parametro, el cual es el nombre de una columna, y yo lo que necesito es el promedio de una fila en la cual tengo 5 columnas, y es de esa linea que necesito el promedio, si me entiendo?

Alguien puede ayudarme a decir mas o menos como puedo hacer esto?
  #2 (permalink)  
Antiguo 11/03/2013, 16:12
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Como saco un promedio Average de varias columnas

tienes 5 columnas, y si pivoteas tu cosulta y sobre los resultados del pivot realizas el avg?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 11/03/2013, 16:51
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 17 años
Puntos: 2
Respuesta: Como saco un promedio Average de varias columnas

Hola,
Lo que quiero es calcular las 5 primeras columnas de una linea, es decir, si hacemos un SELECT TOP 1 * FROM MyTbla
Nos traera una sola linea.
yo lo intente de esta forma:
Código SQL:
Ver original
  1. SELECT
  2. (ISNULL(RingCrF1, 0) +
  3. ISNULL(RingCrF2, 0) +
  4. ISNULL(RingCrF3, 0) +
  5. ISNULL(RingCrF4, 0) +
  6. ISNULL(RingCrF5, 0) +
  7. ISNULL(RingCrF6, 0) +
  8. ISNULL(RingCrF7, 0) +
  9. ISNULL(RingCrF8, 0) +
  10. ISNULL(RingCrF9, 0) +
  11. ISNULL(RingCrF10, 0)  ) / (
  12.         CASE WHEN RingCrF1 IS NULL THEN 0 ELSE 1 END + CASE WHEN RingCrF2 IS NULL THEN 0 ELSE 1 END +
  13.         CASE WHEN RingCrF3 IS NULL THEN 0 ELSE 1 END + CASE WHEN RingCrF4 IS NULL THEN 0 ELSE 1 END +
  14.         CASE WHEN RingCrF5 IS NULL THEN 0 ELSE 1 END + CASE WHEN RingCrF6 IS NULL THEN 0 ELSE 1 END +
  15.         CASE WHEN RingCrF7 IS NULL THEN 0 ELSE 1 END + CASE WHEN RingCrF8 IS NULL THEN 0 ELSE 1 END +
  16.         CASE WHEN RingCrF9 IS NULL THEN 0 ELSE 1 END + CASE WHEN RingCrF10 IS NULL THEN 0 ELSE 1 END
  17.        
  18.     ) AS average_mark
  19. FROM caljum02
  20.     WHERE FechaP = '20130310'
  21.     AND Rollo IN(19,10)
  22.     AND Maquina = 2

El problema es que no me ignora los ceros, y la formula de un average es la suma de todos los elementos divididos entre el numero de elementos, pero si tengo 10 columnas de las cuales solo 5 tienen registros? me lo dividira entre 10, cuando deberia de ser entre 5. algo como esto:
Código SQL:
Ver original
  1. SELECT (RingCrF1+RingCrF2+RingCrF3+RingCrF4+RingCrF5)/5
  2.     FROM caljum02
  3.     WHERE FechaP = '20130310'
  4.     AND Rollo IN(19,10)
  5.     AND Maquina = 2

Pueden ayudarme a hacer esto ignorando los ceros para que no lo sume como un valor mas y no se divida?
  #4 (permalink)  
Antiguo 11/03/2013, 16:59
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Como saco un promedio Average de varias columnas

y si haces un average sin usar la funcion AVG? si no te sirve como regresa los datos pues haz tu mismo tu promedio jejejeje
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 11/03/2013, 17:07
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 17 años
Puntos: 2
Respuesta: Como saco un promedio Average de varias columnas

Para ninguno de los 2 casos estoy usando la funcion AVG
  #6 (permalink)  
Antiguo 11/03/2013, 17:30
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Como saco un promedio Average de varias columnas

Código SQL:
Ver original
  1. CREATE TABLE #temp(
  2. numero INT
  3. )
  4.  
  5. INSERT INTO #temp VALUES (4)
  6. INSERT INTO #temp VALUES (1)
  7. INSERT INTO #temp VALUES (2)
  8. INSERT INTO #temp VALUES (0)
  9. INSERT INTO #temp VALUES (0)
  10. INSERT INTO #temp VALUES (6)
  11.  
  12. SELECT CAST((SUM(total)/SUM(cuantos)) AS DECIMAL(10,2))
  13.  FROM(
  14. SELECT CASE WHEN numero>0 THEN 1 ELSE 0 END cuantos,
  15. CASE WHEN numero>0 THEN numero ELSE 0 END total
  16. FROM #temp) t1
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 11/03/2013, 17:47
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Como saco un promedio Average de varias columnas

y si funciona el query ni siquiera un gracias.....a pero si no funciona luego luego postean que no funciono :(
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 12/03/2013, 10:37
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 17 años
Puntos: 2
Respuesta: Como saco un promedio Average de varias columnas

Tengo una duda Libras, respecto a tu codigo, no logro entender bien su logica, como se supone que va a a leer los valores de mi tabla o los que le pase yo a mano? para validar si hay o no ceros
  #9 (permalink)  
Antiguo 12/03/2013, 10:44
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Como saco un promedio Average de varias columnas

Como se valida con el case, cuando el numero sea mayor a 0 (con lo cual numeros a 0 y en este caso el 0 se pone un 0 en el campo cuantos, asi mismo en el campo total) ya una vez que tenemos los numeros que si contarian y los que no los sumamos y ese seria el numero entre el cual dividiriamos el resultado de la suma de los numeros que manejas

--query que suma los valores que son mayores a 0 y los divide entre el numero de valores mayores a 0
SELECT CAST((SUM(total)/SUM(cuantos)) AS decimal(10,2))
FROM(

--query que valida que numeros son 0 y cuales no
SELECT case when numero>0 then 1 else 0 end cuantos,
case when numero>0 then numero else 0 end total
FROM #temp



) t1


donde irian tus datos....en donde viene el select a la tabla #temp

en tu caso el query quedaria mas o menos de esta manera:

Código SQL:
Ver original
  1. CREATE TABLE #temp(
  2. numero INT,
  3. numero1 INT,
  4. numero2 INT
  5. )
  6.  
  7. INSERT INTO #temp VALUES (4,1,2)
  8. INSERT INTO #temp VALUES (1,2,2)
  9. INSERT INTO #temp VALUES (2,0,1)
  10. INSERT INTO #temp VALUES (0,0,1)
  11. INSERT INTO #temp VALUES (0,0,1)
  12. INSERT INTO #temp VALUES (6,0,1)
  13.  
  14. SELECT CAST(
  15. (SUM(total)+SUM(total1)+SUM(total2))
  16. /
  17. (SUM(cuantos)+SUM(cuantos1)+SUM(cuantos2)) AS DECIMAL(10,2))
  18.  FROM(
  19.  
  20. SELECT
  21. CASE WHEN numero>0 THEN 1 ELSE 0 END cuantos,
  22. CASE WHEN numero>0 THEN numero ELSE 0 END total,
  23. CASE WHEN numero1>0 THEN 1 ELSE 0 END cuantos1,
  24. CASE WHEN numero1>0 THEN numero1 ELSE 0 END total1,
  25. CASE WHEN numero2>0 THEN 1 ELSE 0 END cuantos2,
  26. CASE WHEN numero2>0 THEN numero2 ELSE 0 END total2
  27.  
  28.  
  29. FROM #temp) t1

Aqui el resultado seria 2 porque es la suma de los valores 4+1+2+1+2+2+2+1+1+1+1+6=24 / 12(que son los valores que son mayores a 0)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 12/03/2013 a las 10:54

Etiquetas: columnas, promedio
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 10:31.