SQL - Una mano por favor.

   
Vista:

Una mano por favor.

Publicado por David Sanchez (3 intervenciones) el 12/06/2008 11:19:16
Buenas,

Quiero hacer una pequeña consulta para mostrar unas estadísticas pero no hay manera, ¿alguien me podría echar una mano?

Tengo una tabla con 3 campos.... [Nombre, Bugs, fecha]

Me gustaria mostrar para cada "Año" y "Nombre" el "Número_de_Bugs" y el "Porcentaje". El porcentaje serían los bugs por cada "año" y "nombre" dividido entre el total de bugs de ese año.

Ejemplo:
SELECT YEAR(fecha) AS Año, nombre, sum(bugs) as Total_Bugs,
FROM Tabla
GROUP BY nombre, Año
ORDER BY Año ASC, Total_Bugs DESC

Con esto me mostraría por cada año y nombre el total de bugs.

Algo asi:

2006 Laura 40
2006 Pedro 24
2006 Maria 20
2007 Pedro 15
2007 Laura 13
2007 Maria 10
.....

Y lo que me falta sería la columna porcentaje. En el año 2006 el total de bugs es 40+24+20 =84 por tanto que me mostrara esto:

2006 Laura 40 (resultado de 40/84)
2006 Pedro 24 (resultado de 24/84)
2006 Maria 20 (resultado de 20/84)
2007............
.......................

He intentado con esto:

SELECT YEAR(fecha) AS Año, nombre, sum(bugs) as Total_Bugs,
( sum(bugs) / ( SELECT sum(bugs) FROM Tabla WHERE YEAR(fecha) = Año) ) as Porcentaje
FROM Tabla
GROUP BY nombre, Año
ORDER BY Año ASC, Total_Bugs DESC

Pero me dice que el campo Año no existe :(

¿Alguna idea de como encaminar esto?

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Una mano por favor.

Publicado por Franklin Gamboa (15 intervenciones) el 12/06/2008 15:20:37
Hola

El problema que expones es por la naturaleza del SQL.

SQL es un lenguaje declarativo, eso significa que o la variable/campo existe y es devuelto en tu select por medio de un alias o es parte de las columnas de la tabla; pero si tengo un
subselect, si quiero referenciar una columna del select padre, debo usar el nombre completo de la columna (tabla.columna) para invocarlo.

Entonces tu consulta quedaría algo así, espero que este bien ya que no tuve oportunidad de probarla:

SELECT YEAR(a.fecha) AS Año, a.nombre, sum(a.bugs) as Total_Bugs,
( sum(a.bugs) / ( SELECT sum(b.bugs)
FROM Tabla b
WHERE YEAR(b.fecha) = YEAR(a.fecha)) ) as Porcentaje
FROM Tabla a
GROUP BY nombre, Año
ORDER BY Año ASC, Total_Bugs DESC

Tambien recuerda que año es un alias que estas usando en el bselect padre para enmascarar el nombre de un resultado, entonces no puedes acceder directamente a él en el subselect; por ende hay que hacer referencia a la formula para obtener el año, no al alias ya que invocar el alias va a hacer que el compilador busque una columna llamada año en la tabla, columna que sabemos no existe.

Espero haberte ayudado.

Saludos

Franklin Gamboa M.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Una mano por favor.

Publicado por David Sanchez (3 intervenciones) el 12/06/2008 15:55:56
El problema es que estoy utilizando la misma tabla, solo tengo un nombre de tabla

En todo caso pienso que sería:
SELECT YEAR(fecha) AS Año, nombre, sum(bugs) as Total_Bugs,
( sum(bugs) / ( SELECT sum(bugs) FROM Tabla
WHERE YEAR(fecha) = Tabla.Año) ) as Porcentaje
FROM Tabla
GROUP BY nombre, Año
ORDER BY Año ASC, Total_Bugs DESC

Pero nada esto no funciona ---> "Tabla.Año doest not exist"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Una mano por favor.

Publicado por Isaias (5073 intervenciones) el 12/06/2008 19:43:20
Digame si le funciona:

SELECT YEAR(t1.fecha) AS Año,
t1.nombre,
sum(t1.bugs) as Total_Bugs,
(sum(t1.bugs) / ( SELECT sum(bugs) FROM Tabla
WHERE (year(fecha)) = Year(t1.fecha) and nombre = t1.nombre) as Porcentaje
FROM Tabla t1
GROUP BY YEAR(t1.fecha), t1.nombre
ORDER BY 1 ASC, 3 DESC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar