English version (when available)
select u.email,u.nombre,u.apellidos,l.pueblo,p.nombre from usuario u join pedido pd on u.email=pd.usuario join linped lp on lp.numpedido = pd.numpedido join localidad l on u.pueblo = l.codm and u.provincia = l.provincia join provincia p on l.provincia = p.codp group by u.email,u.nombre,u.apellidos,l.pueblo,p.nombre order by sum(importe*cantidad) desc;Fíjate que no pedimos el resultado de la operación de agregación, solo que se ordene por ella.
No obstante, daríamos por buena también "select u.email,u.nombre,u.apellidos,l.pueblo,p.nombre, sum(importe*cantidad)..."
En todo caso, es un ejemplo de un group-by forzado por el tipo de ordenación que queremos, no porque el cálculo vaya a verse en la tabla resultado.
select u.email,u.nombre,u.apellidos,l.pueblo,p.nombre from usuario u join pedido pd on u.email=pd.usuario join linped lp on lp.numpedido = pd.numpedido join localidad l on u.pueblo = l.codm and u.provincia = l.provincia join provincia p on l.provincia = p.codp group by u.email,u.nombre,u.apellidos,l.pueblo,p.nombre order by sum(importe*cantidad) desc limit 5;El enunciado es un tanto ambiguo en cuanto a lo que pide: "...que más han pedido...". La solución opta por interpretarlo como "que mayor cantidad en euros ha pedido".
La novedad de este ejercicio, si puede llamársela así, es el uso de "limit n", mostrar solo las n primeras filas.
select u.email,u.nombre,u.apellidos,l.pueblo,p.nombre from usuario u join pedido pd on u.email=pd.usuario join linped lp on lp.numpedido = pd.numpedido join localidad l on u.pueblo = l.codm and u.provincia = l.provincia join provincia p on l.provincia = p.codp group by u.email,u.nombre,u.apellidos,l.pueblo,p.nombre order by sum(importe*cantidad) limit 5;
select count(*) cantidad from direnvio d, pedido p where d.email=p.usuario
select provincia,count(distinct p.numpedido) pedidos from usuario u, pedido p, linped l where u.email=p.usuario and p.numpedido=l.numpedido group by provincia having avg(importe*cantidad)>=1500;En este caso, al necesitar las líneas de pedido (LINPED), con count(*) estaríamos contando líneas de pedido, los números de pedido (numpedido) se pueden repetir para la misma provincia. Por ello es necesario count(distinct numpedido), nos piden únicamente cantidad de pedidos.
select a.marca,count(*) cantidad from articulo a, camara c, stock s where a.cod=c.cod and c.cod=s.articulo and s.disponible>0 group by marca having count(*)<20;
select distinct u.provincia,u.pueblo from usuario u, pedido p where p.usuario=u.email group by u.email,u.provincia,u.pueblo having count(*)>1;Solución alternativa:Ten cuidado, lo que te están pidiendo es "cuántos pedidos por usuario". Lo que pasa es que solo queremos mostrar su provincia y localidad. Por eso metemos email en el group by.select distinct provincia,pueblo from usuario where email in (select usuario from pedido group by usuario having count(*)>1);
Dicho de otra forma, si agrupamos solo por (provincia,pueblo) no estarías obteniendo lo que se te pide.
select marca,avg(pvp) promedio from articulo where cod not in (select cod from pack) group by marca having count(*) > 100 order by promedio desc;
select a.cod,a.marca from articulo a, tv, linped l where a.cod=tv.cod and l.articulo=a.cod group by a.cod,a.marca,a.pvp having avg(l.importe)>1.10*a.pvp;Solución alternativa:En el group by hemos tenido que añadir a.pvp y a.marca para que nos permitiera ejecutar, el primero porque se usa en el having, y el segundo por ser un dato a mostrar en la solución. Date cuenta de que cada artículo de ARTICULO tiene un único pvp y una única marca, con lo que no afecta al cálculo del promedio.select a.cod,a.marca from articulo a join tv on a.cod=tv.cod join (select articulo,avg(importe) mimporte from linped group by articulo) l on l.articulo=a.cod where l.mimporte>1.10*a.pvp;
También habría valido, aprovechándonos en este caso de que max(pvp) para cada artículo sigue siendo un valor único:
...
group by a.cod,a.marca
having avg(l.importe)>1.10*max(a.pvp);
La solución alternativa convierte la consulta de agregación en una subconsulta o consulta temporal. En próximas sesiones aprenderemos a trabajar con subconsultas como si fueran tablas temporales.
select a.cod,a.marca,avg(importe) mimporte from articulo a, camara c, linped l where a.cod=c.cod and l.articulo=a.cod group by a.cod,a.marca having count(*)>2 order by a.marca,a.cod;Utilizamos count(*) porque sabemos que la cuenta de filas en LINPED equivale a en cuántas líneas de pedido está cada artículo. Count(linea) valdría también, sería la cuenta de valores no nulos en esa columna, que coincide en este caso con count(*), LINPED.linea no permite nulos. Count(distinct linea) ya no, hay valores repetidos en la columna.
select fecha, count(distinct l.numpedido) cuantos from pedido p, linped l where p.numpedido=l.numpedido and l.importe <=1000 group by fecha;Cuidado, aquí es obligatorio utilizar count(distinct numpedido). ¿Sabes por qué?
select date(fecha), sum(l.cantidad*l.importe) total from pedido p, linped l where p.numpedido=l.numpedido group by fecha order by 2;"Order by 2" es "ordena por la segunda columna", y equivalente en este caso a "order by sum(l.cantidad*l.immporte)".
select numpedido, count(*) lineas from linped group by numpedido order by count(*) desc;
select apellidos from usuario group by apellidos having count(*) >= 2;Solución alternativa:select distinct u1.apellidos from usuario u1, usuario u2 where u1.email != u2.email and u1.apellidos = u2.apellidos order by u1.apellidos;
select apellidos, nombre from usuario group by apellidos,nombre having count(*) >= 2;Solución alternativa:select distinct u1.apellidos,u1.nombre from usuario u1, usuario u2 where u1.email != u2.email and u1.apellidos = u2.apellidos and u1.nombre = u2.nombre order by u1.apellidos;
select pueblo, count(*) provincias from localidad group by pueblo having count(*) >= 2;
select count(*) sinPVP from articulo where pvp is null;
select count(*) 'Descatalogados y sinPVP' from articulo a, stock s where a.cod=s.articulo and pvp is null and entrega='Descatalogado';
select marca,count(*) cuantos from articulo where nombre like '%18-200%' or nombre like '%28-200%' group by marca order by count(*) desc;
select p.codp,p.nombre,avg(cantidad) media, std(cantidad) desvest from provincia p, usuario u,pedido pd,linped l where p.codp=u.provincia and u.email=pd.usuario and pd.numpedido=l.numpedido group by p.codp,p.nombre;
select p.numpedido,p.fecha,u.email,u.apellidos,u.nombre, round(sum(cantidad*importe/1.21*.21),2) iva from usuario u,pedido p,linped l where u.email=p.usuario and p.numpedido=l.numpedido group by p.numpedido,p.fecha,u.email,u.apellidos,u.nombre order by p.fecha,u.email;En importe*cantidad ya está incluido el IVA. Por lo tanto necesitamos calcular la base imponible para determinar cuánto hemos pagado de IVA.
base imponible = importe*cantidad/1.21
IVA = base_imponible*0.21, o también IVA = importe*cantidad-base_imponible
Luego, IVA = importe*cantidad/1.21*0.21
select p.numpedido,p.fecha,u.email,u.apellidos,u.nombre, round(sum(cantidad*importe/1.21),2) base from usuario u,pedido p,linped l where u.email=p.usuario and p.numpedido=l.numpedido group by p.numpedido,p.fecha,u.email,u.apellidos,u.nombre order by p.fecha,u.email;Supongamos x el coste antes de aplicar el IVA (base imponible):
importe*cantidad = x+x*.21
Luego, x = importe*cantidad/1.21
select year(fecha) año, month(fecha) mes, round(sum(importe*cantidad)/1.21*0.21,2) IVA from pedido p join linped l on (l.numpedido = p.numpedido) group by year(fecha), month(fecha) order by year(fecha), month(fecha);base imponible = importe*cantidad/1.21
IVA = base_imponible*0.21
select year(fecha) año, month(fecha) mes, round(sum(importe*cantidad)/1.21,2) base from pedido p join linped l on (l.numpedido = p.numpedido) group by year(fecha), month(fecha) order by year(fecha), month(fecha);base imponible = importe*cantidad/1.21
IVA = base_imponible*0.21
select year(fecha) año, month(fecha) mes, round(sum(importe*cantidad)/1.21,2) base, round(sum(importe*cantidad)/1.21*0.21,2)IVA, round(sum(importe*cantidad),2) total from pedido p join linped l on (l.numpedido = p.numpedido) group by year(fecha), month(fecha) order by year(fecha), month(fecha);base imponible = importe*cantidad/1.21
IVA = base_imponible*0.21
select year(fecha) año, month(fecha) mes, round(sum(importe*cantidad)/1.21,2) base, round(sum(importe*cantidad)/1.21*.21,2) IVA, round(sum(importe*cantidad),2) total from pedido p join linped l on (l.numpedido = p.numpedido) group by year(fecha), month(fecha) having count(distinct l.numpedido) > 10 order by year(fecha), month(fecha);base imponible = importe*cantidad/1.21
IVA = base_imponible*0.21
select year(fecha) año, month(fecha) mes, round(sum(importe*cantidad/1.21),2) base, round(sum(importe*cantidad/1.21*0.21),2) IVA, round(sum(importe*cantidad),2) total from pedido p join linped l on (l.numpedido = p.numpedido) join usuario u on (p.usuario = u.email) where u.provincia != '33' group by year(fecha), month(fecha) having count(distinct l.numpedido) > 10 order by year(fecha), month(fecha);
select fecha, count(distinct l.numpedido) from pedido p join linped l on p.numpedido=l.numpedido where p.numpedido not in (select numpedido from linped where importe<1000) group by fecha;Cuidado, aquí es obligatorio utilizar count(distinct numpedido). ¿Sabes por qué?