English version (when available)
select datediff( (select max(fecha) from pedido), (select min(fecha) from pedido) ) dias;Solución alternativa:select datediff(max(fecha), min(fecha)) dias from pedido;
select (select count(*) from tv) tv, (select count(*) from camara) camaras, (select count(*) from objetivo) objetivos;
select (select count(*) from tv)/(select count(*) from articulo)*100 tvPC, (select count(*) from camara)/(select count(*) from articulo)*100 camarasPC, (select count(*) from objetivo)/(select count(*) from articulo)*100 objetivosPC;Solución alternativa:select (select count(*) from tv)/t.total*100 tvPC, (select count(*) from camara)/t.total*100 camarasPC, (select count(*) from objetivo)/t.total*100 objetivosPC from (select count(*) total from articulo) t;
select email,nombre, apellidos,numpedido, valor from usuario u left join (select p.numpedido,usuario, sum(cantidad*importe) valor from pedido p, linped l where p.numpedido=l.numpedido group by numpedido,usuario having sum(cantidad*importe)>10000) calculo on (email=usuario) where provincia='03' order by valor desc
select email,nombre, apellidos,numpedido, pendiente from usuario u, (select numpedido,usuario from pedido where numpedido not in (select numpedido from linped) ) pedidos, (select usuario,sum(pvp) pendiente from cesta c, articulo a where c.articulo=a.cod group by usuario ) cestas where email=pedidos.usuario and email=cestas.usuario;Date cuenta que el último where utiliza columnas de las tablas temporales.
Para entender mejor qué hace esta consulta, ejecuta las subconsultas por separado:
select numpedido,usuario
from pedido
where numpedido not in (select numpedido from linped)
select usuario,sum(pvp) pendiente
from cesta c, articulo a
where c.articulo=a.cod
group by usuario
select * from (select email,nombre,apellidos, (select count(*) from pedido where month(fecha)=1 and year(fecha)=2010 and usuario=email) enero, (select count(*) from pedido where month(fecha)=2 and year(fecha)=2010 and usuario=email) febrero, (select count(*) from pedido where month(fecha)=3 and year(fecha)=2010 and usuario=email) marzo, (select count(*) from pedido where month(fecha)=4 and year(fecha)=2010 and usuario=email) abril, (select count(*) from pedido where month(fecha)=5 and year(fecha)=2010 and usuario=email) mayo, (select count(*) from pedido where month(fecha)=6 and year(fecha)=2010 and usuario=email) junio, (select count(*) from pedido where month(fecha)=7 and year(fecha)=2010 and usuario=email) julio, (select count(*) from pedido where month(fecha)=8 and year(fecha)=2010 and usuario=email) agosto, (select count(*) from pedido where month(fecha)=9 and year(fecha)=2010 and usuario=email) septiembre, (select count(*) from pedido where month(fecha)=10 and year(fecha)=2010 and usuario=email) octubre, (select count(*) from pedido where month(fecha)=11 and year(fecha)=2010 and usuario=email) noviembre, (select count(*) from pedido where month(fecha)=12 and year(fecha)=2010 and usuario=email) diciembre from usuario) pormeses where enero+febrero+marzo+abril+mayo+junio+julio+agosto+septiembre+octubre+noviembre+diciembre > 1;Solución alternativa:select email,nombre,apellidos, (select count(*) from pedido where month(fecha)=1 and year(fecha)=2010 and usuario=email) enero, (select count(*) from pedido where month(fecha)=2 and year(fecha)=2010 and usuario=email) febrero, (select count(*) from pedido where month(fecha)=3 and year(fecha)=2010 and usuario=email) marzo, (select count(*) from pedido where month(fecha)=4 and year(fecha)=2010 and usuario=email) abril, (select count(*) from pedido where month(fecha)=5 and year(fecha)=2010 and usuario=email) mayo, (select count(*) from pedido where month(fecha)=6 and year(fecha)=2010 and usuario=email) junio, (select count(*) from pedido where month(fecha)=7 and year(fecha)=2010 and usuario=email) julio, (select count(*) from pedido where month(fecha)=8 and year(fecha)=2010 and usuario=email) agosto, (select count(*) from pedido where month(fecha)=9 and year(fecha)=2010 and usuario=email) septiembre, (select count(*) from pedido where month(fecha)=10 and year(fecha)=2010 and usuario=email) octubre, (select count(*) from pedido where month(fecha)=11 and year(fecha)=2010 and usuario=email) noviembre, (select count(*) from pedido where month(fecha)=12 and year(fecha)=2010 and usuario=email) diciembre from usuario where email in (select usuario from pedido where year(fecha)=2010 group by usuario having count(*) > 1);
select provincia,count(*) pedidos from usuario u, (select usuario,p.numpedido,sum(importe*cantidad) total from pedido p join linped l on (p.numpedido=l.numpedido) group by usuario,numpedido) pd where u.email=pd.usuario group by provincia having avg(total)>2500;Solución alternativa:El problema aquí reside en calcular el importe medio de los pedidos por cada provincia. Piensa que si planteas:WITH PD AS (select usuario,p.numpedido,sum(importe*cantidad) total from pedido p join linped l on (p.numpedido=l.numpedido) group by usuario,numpedido) select provincia,count(*) pedidos from usuario u,PD where u.email=PD.usuario group by provincia having avg(total)>2500;
select provincia,count(*),avg(importe*cantidad)
from usuario u,pedido p,linped l
where u.email=p.usuario and p.numpedido=l.numpedido
group by provincia
Lo que está calculando es el promedio de importe*cantidad de todas las líneas de pedidos en cada provincia.
Plantéalo como un problema por etapas. Primero, usuario (lo necesitaremos después), numpedido e importe total de los pedidos:
select usuario,p.numpedido,sum(importe*cantidad) totalpedido
from pedido p,linped l
where p.numpedido=l.numpedido
group by usuario,p.numpedido
Supongamos que llamamos a lo anterior PD. Ahora lo integramos en la consulta que realmente queremos hacer:
select provincia,count(*) pedidos
from usuario u, PD
where u.email=PD.usuario
group by provincia
having avg(totalpedido)>2500;
La solución alternativa, usando CTE, es la sintaxis más cercana a esta explicación.
select distinct l.pueblo from usuario u, localidad l where u.pueblo = l.codm and u.provincia=l.provincia and email in (select usuario from pedido p group by usuario having count(*)>=2);Solución alternativa:select distinct l.pueblo from usuario u, localidad l, pedido p where u.pueblo = l.codm and u.provincia=l.provincia AND u.email=p.usuario group by usuario,l.pueblo,u.provincia having count(*)>=2; -- ---- select l.pueblo from localidad l, (SELECT distinct u.pueblo,u.provincia from pedido p JOIN usuario u ON p.usuario=u.email group by p.usuario,u.pueblo,u.provincia having count(*)>=2) pp where pp.pueblo = l.codm and pp.provincia=l.provincia;
select tv.cod,panel,(select round(avg(pantalla),0) from tv where resolucion='1920 x 1080') pantalla, resolucion, hdreadyfullhd, tdt from tv, articulo a where tv.cod=a.cod and marca='SONY';Solución alternativa:select tv.cod,panel,t.pantalla, resolucion, hdreadyfullhd, tdt from tv, articulo a,(select round(avg(pantalla),0) pantalla from tv where resolucion='1920 x 1080') t where tv.cod=a.cod and marca='SONY';
select (select count(*) from tv) televisores, (select count(*) from camara) camaras, (select count(*) from objetivo) objetivos;
select totalAlicante,deAgost, round(deAgost/totalALicante*100,2) '% agostenses sobre alicantinos' from (select count(*) totalAlicante from usuario where provincia='03') t1, (select count(*) deAgost from usuario where provincia='03' and pueblo='0020') t2;