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.use tiendaonline; 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 having avg(l.importe)>1.10*max(a.pvp);Solución alternativa:En el having hemos tenido que utilizar max(a.pvp) simplemente para que MySQL nos permitiera ejecutar. Date cuenta de que cada artículo de ARTICULO tiene un único pvp y calcular el máximo obtiene ese mismo pvp.select a.cod,a.marca from articulo a, tv, (select articulo,avg(importe) mimporte from linped group by articulo) l where a.cod=tv.cod and l.articulo=a.cod and l.mimporte>1.10*a.pvp;
La solución alternativa salve este inconveniente convirtiendo la consulta a LINPED en una subconsulta o consulta temporal.
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 habrá tantas filas como haya en LINPED, justo las que queremos contar. Count(linea) valdría también, sabemos que no hay nulos en esta columna. Count(distinct linea) 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;base imponible = importe*cantidad/1.21
IVA = base_imponible*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
Pero SQL no permite utilizar la etiqueta de columna directamente, lo que nos obliga a: importe*cantidad/1.21*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);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,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);Solución alternativa:base imponible = importe*cantidad/1.21select año,mes,round(base,2),round(base*0.21,2) IVA,round(base+base*0.21,2) total from ( select year(fecha) año, month(fecha) mes, sum(importe*cantidad)/1.21 base from pedido p join linped l on (l.numpedido = p.numpedido) group by year(fecha), month(fecha) order by year(fecha), month(fecha) ) t;
IVA = base_imponible*0.21
Pero SQL no permite utilizar la etiqueta de columna directamente, lo que nos obliga a: importe*cantidad/1.21*0.21
Otra forma de solucionarlo, utilizando una subconsulta, aprovecha el cálculo de la base imponible.
select year(fecha) año, month(fecha) mes, round(sum(importe*cantidad)*.79,2) base, round(sum(importe*cantidad)*.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);
select year(fecha) año, month(fecha) mes, round(sum(importe*cantidad)*.79,2) base, round(sum(importe*cantidad)*.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, linped l where p.numpedido=l.numpedido and 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é?