Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Practica 10
#1
Estoy haciendo la practica 10 preparándome para el parcial de mañana.
Cualquier corrección es bienvenida y si es una duda intentaremos responderla.


Código:
--A) Hallar los clientes deudores ordenado en forma alfabetica
SELECT *
FROM clientes
WHERE saldocli<0
ORDER BY nyape;

-- B) Hallar los articulos que se deberían reponer
SELECT *
FROM articulos
WHERE stock<=pto_reposicion;

-- C) Averiguar los clientes que viven en Capital
SELECT *
FROM clientes
WHERE LOWER(localidad) LIKE 'capital%';

-- D) Averiguar los clientes que vivan en Capital o en Carapachay y no sean deudores
SELECT *
FROM clientes
WHERE (localidad LIKE 'Capital%' OR localidad LIKE 'Carapachay')
AND saldocli>=0

-- E) Averiguar la cantidad de cada uno de los artículos vendidos durante
--    marzo del 2010, ordenado segun la cantidad vendida.
--    (Rsta: 12 FILAS)
SELECT articulo, SUM(cantidad) AS cantidad
from detalles
WHERE nrofactura IN
(SELECT nrofactura
FROM facturas
WHERE fecha BETWEEN '01-03-2010' AND '31-03-2010')
GROUP BY articulo
ORDER BY cantidad;

-- F) Hallar los importes totales día a día durante abril del 2010, ordenados en
--    forma decreciente
SELECT fecha, SUM(cantidad*preciouni)
FROM facturas AS f, detalles AS d
WHERE f.nrofactura=d.nrofactura
AND fecha BETWEEN '01-04-2010' AND '30-04-2010'
GROUP BY fecha

--Ahora usando JOIN
SELECT fecha, SUM(cantidad*preciouni)
FROM facturas AS f
INNER JOIN detalles AS d
ON f.nrofactura=d.nrofactura
AND fecha BETWEEN '01-04-2010' AND '30-04-2010'
GROUP BY fecha
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#2
Agrego los puntos G y H.


Código:
-- G) Listar los rubros que posean actualmente stock por debajo del punto de reposición
SELECT *
FROM rubros
WHERE cod_rubro IN
(SELECT rubro
FROM articulos
WHERE stock<pto_reposicion)

-- H) Obtener las fechas en las que se hayan vendido más de $100.-
--    (Rsta: filas 20)
SELECT f.fecha, SUM(d.cantidad*d.preciouni)
from FACTURAS AS f, DETALLES AS d
where f.nrofactura=d.nrofactura
group by f.fecha
having SUM(d.cantidad*d.preciouni)>100
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#3
Wade Wilson escribió:Estoy haciendo la practica 10 preparándome para el parcial de mañana.
Cualquier corrección es bienvenida y si es una duda intentaremos responderla.
<CODEBOX codebox="sql" file="practica10.sql">[codebox=sql file=practica10.sql]
--A) Hallar los clientes deudores ordenado en forma alfabetica
SELECT *
FROM clientes
WHERE saldocli<0
ORDER BY nyape;

-- B) Hallar los articulos que se deberían reponer
SELECT *
FROM articulos
WHERE stock<=pto_reposicion;

-- C) Averiguar los clientes que viven en Capital
SELECT *
FROM clientes
WHERE LOWER(localidad) LIKE 'capital%';

-- D) Averiguar los clientes que vivan en Capital o en Carapachay y no sean deudores
SELECT *
FROM clientes
WHERE (localidad LIKE 'Capital%' OR localidad LIKE 'Carapachay')
AND saldocli>=0

-- E) Averiguar la cantidad de cada uno de los artículos vendidos durante
-- marzo del 2010, ordenado segun la cantidad vendida.
-- (Rsta: 12 FILAS)
SELECT articulo, SUM(cantidad) AS cantidad
from detalles
WHERE nrofactura IN
(SELECT nrofactura
FROM facturas
WHERE fecha BETWEEN '01-03-2010' AND '31-03-2010')
GROUP BY articulo
ORDER BY cantidad;

-- F) Hallar los importes totales día a día durante abril del 2010, ordenados en
-- forma decreciente
SELECT fecha, SUM(cantidad*preciouni)
FROM facturas AS f, detalles AS d
WHERE f.nrofactura=d.nrofactura
AND fecha BETWEEN '01-04-2010' AND '30-04-2010'
GROUP BY fecha

--Ahora usando JOIN
SELECT fecha, SUM(cantidad*preciouni)
FROM facturas AS f
JOIN detalles AS d
ON f.nrofactura=d.nrofactura
AND fecha BETWEEN '01-04-2010' AND '30-04-2010'
GROUP BY fecha
[/codebox]</CODEBOX>

Excelente Wade!!! no las probé en base de datos, pero a simple vista son todas correctas! Yo me perdí un par de clases, y no sé como las explicó el profe pero cuando hagas el join (como pide el enunciado), en general es más claro escribir inner join. Pero todo depende de como lo haya explicado el profe!!

Dejo un cuadrito con joins
[Imagen: joins.png]
[Imagen: firma_uno_foros1.png]
Responder
#4
La verdad es que yo también falte a varias clases y no sé como lo explicó el profesor.
Gracias por la corrección y el gráfico, CodePainter.
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#5
Wade Wilson escribió:La verdad es que yo también falte a varias clases y no sé como lo explicó el profesor.
Gracias por la corrección y el gráfico, CodePainter.

Quedate tranquilo que no era corrección! Tomalo como una manera alternativa ;)
[Imagen: firma_uno_foros1.png]
Responder
#6
punto H

Código:
SELECT f.fecha, SUM(d.cantidad*d.preciouni)
from FACTURAS AS f, DETALLES AS d
where f.nrofactura=d.nrofactura
group by f.fecha
having SUM(d.cantidad*d.preciouni)>100
Responder
#7
Gracias Oscar.
Voy a modificar el punto H por el tuyo.
Y voy a poner el INNER en el JOIN.
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#8
Intenté hacerlo con join pero de esta manera me quedó mas simple.

Código:
-- I A) Averiguar los rubros con movimientos del 15 al 30 de Abril del 2010 (Rsta: 3 filas)
SELECT *
FROM rubros
WHERE cod_rubro IN
(SELECT rubro
FROM articulos
WHERE nroartic IN
(SELECT d.articulo
FROM facturas AS f, detalles AS d
WHERE f.nrofactura=d.nrofactura AND
f.fecha BETWEEN '15-04-2010' AND '30-04-2010'))
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#9
Encontré esto por ahí respecto del uso de una consulta en lugar de una tabla.

Cita:Subconsulta en lugar de una tabla

Se pueden emplear subconsultas que retornen un conjunto de registros de varios campos en lugar de una tabla.

Se la denomina tabla derivada y se coloca en la cláusula "from" para que la use un "select" externo.

La tabla derivada debe ir entre paréntesis y tener un alias para poder referenciarla. La sintaxis básica es la siguiente:

select ALIASdeTABLADERIVADA.CAMPO
from (TABLADERIVADA) as ALIAS;
La tabla derivada es una subconsulta.

Podemos probar la consulta que retorna la tabla derivada y luego agregar el "select" externo:

select f.*,
(select sum(d.precio*cantidad)
from Detalles as d
where f.numero=d.numerofactura) as total
from facturas as f;
La consulta anterior contiene una subconsulta correlacionada; retorna todos los datos de "facturas" y el monto total por factura de "detalles". Esta consulta retorna varios registros y varios campos y será la tabla derivada que emplearemos en la siguiente consulta:

select td.numero,c.nombre,td.total
from clientes as c
join (select f.*,
(select sum(d.precio*cantidad)
from Detalles as d
where f.numero=d.numerofactura) as total
from facturas as f) as td
on td.codigocliente=c.codigo;
La consulta anterior retorna, de la tabla derivada (referenciada con "td") el número de factura y el monto total, y de la tabla "clientes", el nombre del cliente. Note que este "join" no emplea 2 tablas, sino una tabla propiamente dicha y una tabla derivada, que es en realidad una subconsulta.
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#10
Bueno, sigo subiendo lo que llego a hacer de la practica 10.
Si alguien puede comparar el resultado de esta consulta con lo que hicieron y decirme si les da igual se agradecería.

Código:
-- J) Listar Numero y nombre de los cliente. Además, listar la cantidad de facturas que tuvo
--    durante Marzo y Abril del 2010 considerando SOLO las facturas en las que compro articulos
--    del rubro 3, ordenado por numero de cliente. (Rsta: 7 filas)
SELECT distinct c.nrocli,c.nyape, count(*)
FROM clientes AS c, facturas AS f, detalles AS d,articulos AS a
WHERE c.nrocli=f.cliente AND
f.nrofactura=d.nrofactura AND
d.articulo=a.nroartic AND
a.rubro=3 AND
f.fecha BETWEEN '01-03-2010' AND '30-04-2010'
Group BY c.nrocli
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#11
Código:
-- K) Listar Numero y nombre de los cliente y la cantidad de facturas que tuvo durante
--    Marzo y Abril del 2010 con articulos del rubro 3 y CON MAS DE 3 FACTURAS,
--    ordenado por numero de cliente. (Rsta: 1 fila)
SELECT DISTINCT c.nrocli,c.nyape, count(*)
FROM clientes AS c, facturas AS f, detalles AS d,articulos AS a
WHERE c.nrocli=f.cliente AND
f.nrofactura=d.nrofactura AND
d.articulo=a.nroartic AND
a.rubro=3 AND
f.fecha BETWEEN '01-03-2010' AND '30-04-2010'
GROUP BY c.nrocli
HAVING count(*)>3
ORDER BY c.nrocli
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#12
Código:
-- L) Calcular la cantidad de unidades del artículo 4040 vendidas en marzo del 2010.
--    (Rsta: 8 articulos)
SELECT SUM(d.cantidad) AS cantidad
FROM facturas AS f, detalles AS d, articulos AS a
WHERE f.nrofactura=d.nrofactura AND
d.articulo=a.nroartic AND
a.nroartic=4040 AND
f.fecha BETWEEN '01-03-2010' AND '31-03-2010'
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#13
Código:
-- M) Calcular la cantidad de facturas en las que vendieron artículos del rubro 3
--    (Rsta: 27 facturas)
SELECT COUNT(DISTINCT f.nrofactura)
FROM facturas as f, detalles AS d, articulos AS a
WHERE f.nrofactura=d.nrofactura AND
d.articulo=a.nroartic AND
a.rubro=3
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#14
Este me dio 114,125.
A alguien le dio igual?

Código:
-- N) Obtener el promedio del importe diario de las ventas del mes de mayo del 2010.
SELECT AVG(ventadia.total)
FROM
(SELECT fecha, SUM(d.cantidad*d.preciouni) AS total
FROM facturas AS f, detalles AS d
WHERE f.nrofactura=d.nrofactura AND
f.fecha BETWEEN '01-05-2010' AND '31-05-2010'
GROUP BY fecha) AS ventadia
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder
#15
Código:
-- O) Listar el numero, nombre, apellido y el total facturado de los clientes que
--    hayan gastado más de $150 durante el mes de mayo de 2010.
SELECT c.*, SUM(d.cantidad*d.preciouni) AS facturado
FROM clientes AS c, facturas AS f, detalles AS d
WHERE c.nrocli=f.cliente AND
f.nrofactura=d.nrofactura AND
f.fecha BETWEEN '01-05-2010' AND '31-05-2010'
GROUP BY c.nrocli
HAVING SUM(d.cantidad*d.preciouni)>150
Time to make the chimi-fucking-changas!!!!!!!!!!
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)