UTNianos

Versión completa: [PEDIDO] [Gestion de Datos] Final 04/12/2012
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
(28-02-2015 22:50)Fly escribió: [ -> ]3b)
Estuve probando toooodas las opciones que mandaron acá... Les digo que tal:

- El de leofeuer está MAL, me devuelve NULL
- El de Martinrg también está mal... muy mal!!!! Me tira errores por todos lados.
- El de chacho está bien planteado PERO había algo mal con los isnull... acá les tiro la correción:



select c.nombre
from Examen_Clientes c
inner join Examen_Facturas f2010 on c.id_cliente = f2010.f_cliente
and YEAR(f2010.fecha) = 2010
inner join Examen_Facturas f2009 on c.id_cliente = f2009.f_cliente
and YEAR(f2009.fecha) = 2009
group by c.nombre
having SUM(isnull(f2010.importe,0)) > SUM(isnull(f2009.importe,0))
order by 1



- El de Aoshido está bien planteado PERO la pifió con los alias, y faltó el order by... acá lo corregí:



select
c.nombre
from
Examen_Clientes c
join Examen_Facturas f09 on f09.f_cliente = c.id_cliente and year(f09.fecha) = 2009
join Examen_Facturas f10 on f10.f_cliente = c.id_cliente and year(f10.fecha) = 2010
group by c.nombre
having sum(f10.importe) > sum(f09.importe)
order by 1



- ... y finalmente les tiro MI versión, es la que me gusta más porque la hice yo =P (y porque además no necesité de un GROUP BY)


SELECT c.nombre
FROM dbo.Examen_Clientes c
WHERE ( SELECT SUM(f2.importe)
FROM Examen_Facturas f2
WHERE f2.f_cliente = c.id_cliente
AND YEAR(f2.fecha) = 2010
)
>
( SELECT SUM(f3.importe)
FROM Examen_Facturas f3
WHERE f3.f_cliente = c.id_cliente
AND YEAR(f3.fecha) = 2009
)
ORDER BY 1



Saludos!


A simple vista parece ideal la última opción
Rescato este thread de la muerte para aportar mi solución al 3b. Si les parece que está mal avisen porfa



SELECT c.nombre
FROM Clientes c
INNER JOIN Facturas f ON f.f_cliente = c.id_cliente
WHERE SUM(CASE WHEN f.Fecha BETWEEN '20100101' AND '20101231') > SUM(CASE WHEN f.Fecha BETWEEN '20090101' AND '20091231')
AND SUM(CASE WHEN f.Fecha BETWEEN '20100101' AND '20101231') > 0
GROUP BY c.nombre
ORDER BY c.nombre ASC


H3rnst perdon mi mala memoria pero eso funciona? Lo probaste?

Que yo recuerde las funciones de agregación como el Sum no se podían usar en el Where, porque aun no está agregado.

No deberías usarlo en el having, por ejemplo ?
(30-11-2015 13:58)gonnza escribió: [ -> ]H3rnst perdon mi mala memoria pero eso funciona? Lo probaste?

Que yo recuerde las funciones de agregación como el Sum no se podían usar en el Where, porque aun no está agregado.

No deberías usarlo en el having, por ejemplo ?

Tenés razón, acá encontré una respuesta en SO para un ejemplo parecido.
Gracias!
Esto deberia funcionar:

SELECT C.Id
FROM CLIENTES C JOIN FACTURAS F ON (F.cliente = C.Id)
WHERE
EXISTS (SELECT 1 FROM FACTURAS F
WHERE C.Id = F.cliente AND YEAR(Fecha) = 2009
)
AND F.Fecha = 2010
GROUP BY C.Id
HAVING
SUM(F.Importe) >= (SELECT SUM(Importe) FROM FACTURAS F WHERE F.cliente = C.Id)
coincido con el ultimo post... pero le faltaria el año 2009 en el having

SELECT C.Nombre
FROM CLIENTES C JOIN FACTURAS F ON (F.cliente = C.Id)
WHERE
YEAR(Fecha) = 2010
GROUP BY C.nombre
HAVING
SUM(F.Importe) >= (SELECT SUM(Importe) FROM FACTURAS F WHERE F.cliente = C.Id and YEAR(Fecha) = 2009 )
and (SELECT SUM(Importe) FROM FACTURAS F WHERE F.cliente = C.Id and YEAR(Fecha) = 2009 ) > 0
order by C.Nombre


o asi

SELECT C.Nombre
FROM CLIENTES C JOIN FACTURAS F ON (F.cliente = C.Id)
WHERE
YEAR(Fecha) = 2010 AND
EXISTS (SELECT 1 FROM FACTURAS F2
WHERE C.Id = F2.cliente AND YEAR(Fecha) = 2009)
GROUP BY C.nombre
HAVING
SUM(F.Importe) >= (SELECT SUM(Importe) FROM FACTURAS F WHERE F.cliente = C.Id and YEAR(Fecha) = 2009 )
order by C.Nombre
Páginas: 1 2
URLs de referencia