Veis algun error en estos dos ejercicios de sql??
Tenemos estas tablas:
Clientes(DNI,nombre,direccion, poblacion, districto postal, provincia)
Articulos(CODIGO, descripcion, cantidadstock, precio)
Ventas(dni, codigo, data, cantidadvendida)
1-Select para saber el total de euros vendidos a cada cliente a lo largo de tota la vida.
FORMATO: DNI nombre importe total
--------------------------------
SELECT v.dni, cl.nombre, sum(v.cantidadvendida*a.preu) importe total
FROM clientes cl, articulos a, ventas v
WHERE cl.dni=v.dni
GROUP BY v.dni,cl.nombre
ORDER BY cl.dni;
2-Select para saber los euros vendidos de un articulo kualkiera, el codigo del articulo se pide mediante variables de sustitucion.
Codigo descripcion importe total
----------------------------------------
DEFINE codart
SELECT v.codigo, a.descripcion, sum(v.cantidadvendida*a.preu) importe total
FROM articulos a, ventas v
WHERE v.codigo=a.codigo
And v.codigo=&codart
GROUP BY v.codi, a.descripcion
ORDER BY v.codi;
si son corretos decidmelo.
Pregunta importante, almenos para mi.
Si se hace un calculo, ejemplo:
Select tabl1.camp1 , tabla2.camp2, (tabla2.camp2*tabla3.camp3) as Total
From tabla1, tabla2, tabla3
where ....
Pregunta: Siempre k hay un calculo en la select , Hay que poner un GROUP BY??
Gracias
Lo siento por contestar tan tarde, pero espero que aun te sirva de algo xD
Cita de: CrÄsH en 27 Marzo 2009, 13:27 PM
Veis algun error en estos dos ejercicios de sql??
Tenemos estas tablas:
Clientes(DNI,nombre,direccion, poblacion, districto postal, provincia)
Articulos(CODIGO, descripcion, cantidadstock, precio)
Ventas(dni, codigo, data, cantidadvendida)
1-Select para saber el total de euros vendidos a cada cliente a lo largo de tota la vida.
FORMATO: DNI nombre importe total
--------------------------------
SELECT v.dni, cl.nombre, sum(v.cantidadvendida*a.preu) importe total
FROM clientes cl, articulos a, ventas v
WHERE cl.dni=v.dni
GROUP BY v.dni,cl.nombre
ORDER BY cl.dni;
Error quiza no, la logica de lo que quieres hacer permanece que es lo importante, pero en tu lugar yo usaria los Joins para hacerlo aunque se puede hacer en cierto modo de la forma en que tu lo has planteado.
Palara auxiliarme un poco en este intento de explicacion he creado las tablas e insertado 5 registros en cada tabla.
registros por tabla:
mysql> select * from clientes;
+------+--------------+
| dni | nombre |
+------+--------------+
| 1 | carlos |
| 2 | pepito |
| 3 | fulanito |
| 4 | menganito |
| 5 | sutanito |
+------+--------------+
5 rows in set (0.00 sec)
mysql> select * from articulos;
+--------+------+---------------------------+
| codigo | preu | descripcion |
+--------+------+---------------------------+
| 1 | 0.25 | grapas |
| 2 | 0.5 | lapicero bic |
| 3 | 0.75 | lapiz mogol |
| 4 | 0.95 | lapiz facela |
| 5 | 2.95 | colores 6 unidades |
| 6 | 9.95 | libro - La Ceiba |
+--------+------+----------------------------+
6 rows in set (0.00 sec)
mysql> select * from ventas;
+--------+--------------+------------+
| codigo | cant_vendida | dni |
+--------+--------------+------------+
| 1 | 20 | 1 |
| 2 | 10 | 5 |
| 1 | 35 | 3 |
| 5 | 5 | 3 |
| 5 | 5 | 5 |
| 1 | 30 | 1 |
| 2 | 12 | 2 |
| 3 | 2 | 3 |
| 4 | 5 | 5 |
| 4 | 5 | 4 |
| 4 | 4 | 4 |
+--------+--------------+-------------+
11 rows in set (0.00 sec)
ahora, el numero de registros de la consulta deberia ser simplemente 5
asi
select a.dni,a.nombre,sum(b.preu * c.cant_vendida)total_importe from clientes a inner join ventas c on a.dni=c.dni inner join articulos b on b.codigo=c.codigo group by a.dni,a.nombre order by a.dni;
+------+-----------+-------------------------+
| dni | nombre | total_importe |
+------+-----------+-------------------------+
| 1 | carlos | 12.5 |
| 2 | pepito | 6 |
| 3 | fulanito | 25.00 |
| 4 | menganito | 8.55 |
| 5 | sutanito | 24.50 |
+------+-----------+-------------------------+
5 rows in set (0.12 sec)
Cita de: CrÄsH en 27 Marzo 2009, 13:27 PM
2-Select para saber los euros vendidos de un articulo kualkiera, el codigo del articulo se pide mediante variables de sustitucion.
Codigo descripcion importe total
----------------------------------------
DEFINE codart
SELECT v.codigo, a.descripcion, sum(v.cantidadvendida*a.preu) importe total
FROM articulos a, ventas v
WHERE v.codigo=a.codigo
And v.codigo=&codart
GROUP BY v.codi, a.descripcion
ORDER BY v.codi;
bueno, este es bastante parecido , solo que no involucramos la tabla clientes
ya que solo tengo 5 codigos en la tabla articulos, la consulta tambien deberia devolverme solo 5 registros
select a.codigo,a.descripcion,sum(a.preu*b.cant_vendida) total_importe from articulos a inner join ventas b on a.codigo = b.codigo group by a.codigo,a.descripcion order by a.codigo;
+--------+--------------------+----------------------------+
| codigo | descripcion | total_importe |
+--------+--------------------+----------------------------+
| 1 | grapas | 21.25 |
| 2 | lapicero bic | 11 |
| 3 | lapiz mogol | 1.5 |
| 4 | lapiz facela | 13.29 |
| 5 | colores 6 unidades | 29.50 |
+--------+--------------------+----------------------------+
5 rows in set (0.00 sec)
espero no haberme equivocado XD
Cita de: CrÄsH en 4 Abril 2009, 01:44 AM
Si se hace un calculo, ejemplo:
Select tabl1.camp1 , tabla2.camp2, (tabla2.camp2*tabla3.camp3) as Total
From tabla1, tabla2, tabla3
where ....
Pregunta: Siempre k hay un calculo en la select , Hay que poner un GROUP BY??
no en los calculos, sino cuando usas sum( ) o un max( ) etc
porque podrias tener
select codigo, (precio * cant_vendida) total from ventas y en este caso no necesitas hacer la agrupacion, incluso creo que si das group by te daria error porque no hay datos que agrupar, porque el campo lo estas agregando por registro, entonces si tienes 10 veces repetido el codigo 1 te saldran las 10 veces en la consulta
espero que en algo te ayude ;)
salu2
Seguro que te as fijado bien en el anunciado del segundo, pq se tenia que hacer con variables de sustitucion y no pones ninguna.
En la select yo llamo el codigo de la tabla ventas y tu al codigo de la tabla articulos, estan los dos bien, o el mio no esta bien?
Y el primero lo hemos echo igual pero tu usas inners y yo where.
Y tambien pasa lo mismo con la select que tu seleccionas campos de otra tablas, supongo que no importara como ya hacemos el where, me equivoco??
Y gracias por contestarme esa pregunta, era una cosa que me preocupaba desde hacia tempo.
Gracias! :D
Los tuyos y los mios estan bien en ambos literales, yo coloque nada mas otra forma de hacerlo ñ_ñ
solo que habran casos en los que necesitaras usar algun Join, como el left,right,full
porque si relaciones una campo con otro lo que sucede es algo asi
0001 = 0001
pero y si uno de ellos estan vacios?
0001 = nada
entonces con un join podrias ver este tipo de contenidos en los que si bien quieres relacionar un campo con otro tambien podria ser que te interese mas ver todos los registros aunque en algun punto no se pueda establecer una relacion (vaya, nose si me explique bien xD )
con lo del segundo es cierto xD no lei bien xD
SELECT a.codigo,a.descripcion,sum(a.preu*b.cant_vendida) total_importe
FROM articulos a
INNER JOIN ventas b ON a.codigo = b.codigo
WHERE b.codigo = variable
GROUP BY a.codigo,a.descripcion ORDER BY a.codigo;
salu2
Tb te decia que en las selects llamamos a campos diferents, es decir, tu llamas el campo codigo de una tabla y yo de la otra. Y te preguntaba si da igual el campo que llames si haces el where???
El seundo ejercicio que pide usar variables de sustitucion, tu me as puesto variable, sin & ni nada.es correcto?
Yo puse un DEFINE hace falta??
Gracias
Hi
pues, si, usamos dni's distintos, pero al final creo que no importa, por lo menos en el ejemplo de ls tablas que coloque arriba no importa, ya que seguiria devolviendo los mismos registros.
donde trabajo se dio un caso curioso, aca quien creo el sistema guarda la descripcion del producto en la tabla padre y en la tabla ventas, ahora bien, me toco hacer una consulta pequeña en la que debia filtrar cierta informacion en la descripcion, yo como habitualmente hago, tome la descripcion de la tabla padre, pero que paso? que me equivoque en cierto modo XD, cuando se hizo una venta la descripcion de cierto codigo habia cambiado, con el tiempo volvio a cambiar y entonces hubieron dos descripciones distintas, la pregunta fue, cual de ellas era la que queriamos ver xD, en lo que comento, lo que necesitabamos era la descripcion con la que se vendio xD
el segundo ejercicio depende, el gestor de datos que yo uso mas frecuentemente no necesita un DEFINE ni un & , en MySQL no he probado si esto es necesario (cuando lo compruebe te aviso ;) )
salu2
ok, gracias
Por cierto como llebas los reportes, si no estas habituado a ellos pues mirame solo la select.
-Comandos para imprimir el siguiente listado de ventas del dia.Con una pagina por cliente i teniendo en cuenta k un cliente no tendra mas ventas en un dia k las k entren en una pagina.
Las ventas no estan agrupadas, es decir, si el articulo1 se vende 2 veces al cliente1 el mismo dia apareceran dos lineas.
Formato:
Ventas del Dia:dd/mm/aaaa
DNI:11.111.111z Nombre: cliente
Direccion: Poblacion: Provincia:
VENTAS:
CODIGO DESCRIPCION CANTIDAD PRECIO TOTAL
A0001 ArTICLE1 10 100,00 1000,00
SUMA XXXXX
SET ECHO OFF
SET VERIFY OFF
BREAK ON dni skip page
COMPUTE SUM LABEL 'SUMA' OF TOTAL ON PAGE
Column data noprint new_value vdata
Column dni noprint new_value vdni
Column nombre noprint new_value vnombre
Column direccion noprint new_value vdireccion
Column poblacion noprint new_value vpoblacion
Column provincia noprint new_value vprovincia
TTI right 'Ventas del dia:'vvdata skip1
left 'DNI:' vcldni right 'Nombre:' vclnombre skip1
left 'Direccion:'vcldireccion 'Poblacio:'vclpoblacion 'Provincia:'vclprovincia skip1
left 'VENTAS:'
Select v.data, cl.dni, cl.nombre, cl.direccion, cl.poblacion, cl.provincia, v.codigo, a.descripcion, v.cantidadvendida, a.precio,
sum(v.cantidadvendida*a.precio) TOTAL
From articulos a, ventas v, clientes cl
WHERE cl.dni=v.dni
And a.codigo=v.codigo
Group by v.data, cl.dni, cl.nombre, cl.direccion, cl.poblacion, cl.provincia, v.codigo, a.descripcion, v.cantidadvendida, a.precio
Order by v.codi,a.descripcion;
SET VERIFY ON
SET ECHO ON
No hace falta que me lo hagas con joins, solo com que me digas si hay algo mal, ya me va bien.
El group by lo he echo copiando toda la select excepto el SUM.
Graciassss
No lo he probado, pero segun veo el codigo, si tienes un codigo A0001 varias veces, este te saldra solo una vez porque los estas agrupando con el GROUP BY :P
si lo quieres mostrar asi (por ejemplo)
DNI:11.111.111z Nombre: cliente
Direccion: Poblacion: Provincia:
VENTAS:
CODIGO DESCRIPCION CANTIDAD PRECIO TOTAL
A0001 ArTICLE1 10 100,00 1000,00
A0001 ArTICLE1 10 100,00 1000,00
A0001 ArTICLE1 10 100,00 1000,00
A0001 ArTICLE1 10 100,00 1000,00
A0001 ArTICLE1 10 100,00 1000,00
A0001 ArTICLE1 10 100,00 1000,00
A0001 ArTICLE1 10 100,00 1000,00
A0001 ArTICLE1 10 100,00 1000,00
debes quitar el sum( ) ,ya que al hacerlo lo que haces es sumar todo el campo total, pero si lo sumas quiere decir que 8 registros (en mi ejemplo) los haces un solo registro, y para que no te de error tienes que agruparlo como lo estas haciendo ahorita.
aparte de quitar el sum( ) tambien tienes que modificar el GROUP BY que estas utilizando
por cierto, que gestor de bases utilizas?
salu2
Cita de: sempus en 20 Abril 2009, 06:33 AM
No lo he probado, pero segun veo el codigo, si tienes un codigo A0001 varias veces, este te saldra solo una vez porque los estas agrupando con el GROUP BY :P
El codigo A0001 en teoria solo tendria que existir 1, no crees? quizas me ekivoke ya que el enunciado no es muy claro.
Cita de: sempus en 20 Abril 2009, 06:33 AM
aparte de quitar el sum( ) tambien tienes que modificar el GROUP BY que estas utilizando
modificar o eliminar el Group by?? pq si quito la funcion SUM() tb tendre k kitar el group by.
Cita de: sempus en 20 Abril 2009, 06:33 AM
por cierto, que gestor de bases utilizas?
oracle
Cita de: CrÄsH en 20 Abril 2009, 15:11 PM
El codigo A0001 en teoria solo tendria que existir 1, no crees? quizas me ekivoke ya que el enunciado no es muy claro.
pues esto es lo que yo pienso, no tiene gracia tener mas de una vez el mismo codigo, porque en la venta bastaria con cambiarle la cantidad que esta comprando el cliente
pero yo lo dije por esto
Cita de: CrÄsH en 18 Abril 2009, 12:29 PM
Las ventas no estan agrupadas, es decir, si el articulo1 se vende 2 veces al cliente1 el mismo dia apareceran dos lineas.
Podria ser que haya hecho dos compras el mismo dia como tu dices,nose si llevas correlativos de factura o si separas las ventas por algun numero correlativo, entonces la venta no seria la misma y por lo tanto deberias ver los datos no agrupados, aunque si es como esta en el ejemplo no hay problema, deseas ver un solo total y no la frecuencia del cliente al comprar.
Cita de: CrÄsH en 20 Abril 2009, 15:11 PM
modificar o eliminar el Group by?? pq si quito la funcion SUM() tb tendre k kitar el group by.
puedes agrupar aun si quitas el sum( ), en los primeros post dije que agrupabas si usas un sum( ) , max( ) etc, pero esto es para que la consulta no devuelva error (porque group by es obligatorio ir en esos casos), pero puede darse tambien que tienes datos repetidos (para mi los datos repetidos son todos aquellos que son exactamente iguales) entonces para eliminar los repetidos o para formar un cursor sin datos repetidos tambien puedes hacer uso del group by.
por ejemplo, tienes tabla1.nombre
+---nombre---+
+---sempus---+
+---sempus---+
+---sempus---+
+---sempus2---+
+---sempus2---+
+---sempus2---+
puedes usar el group by para que el resultado devuelva solo "sempus" y "sempus2"
select nombre from tabla1 group by nombre
aunque esto tambien lo podrias hacer con un
select nombre distinct from tabla1
el caso es que el group by lo puedes usar aun si quitas el sum( )
salu2
Como tengo que dejarlo finalmente?
Quitando el sum() i como dejo el group by?
Pq el break y el compute sabes si estan bien?
CitarComo tengo que dejarlo finalmente?
Quitando el sum() i como dejo el group by?
Esto depende de como sea el resultado final al que tenemos llegar, tienes el enunciado? asi lo leo, talvez ya lo tengas bien :)
CitarPq el break y el compute sabes si estan bien?
nose, no uso oracle, me imagino que esto es de ese gestor
salu2
Este es el enunciado es :
3-Comandos para imprimir el siguiente listado de ventas del dia.Con una pagina por cliente i teniendo en cuenta k un cliente no tendra mas ventas en un dia k las k entren en una pagina.
Las ventas no estan agrupadas, es decir, si el articulo1 se vende 2 veces al cliente1 el mismo dia apareceran dos lineas.
Formato:
Ventas del Dia:dd/mm/aaaa
DNI:11.111.111z Nombre: cliente
Direccion: Poblacion: Provincia:
VENTAS:
CODIGO DESCRIPCION CANTIDAD PRECIO TOTAL
A0001 ArTICLE1 10 100,00 1000,00
SUMA XXXXX
xD
es el mismo que habias colocado antes, osea que yo no lei bien :-\
segun entiendo el enunciado,entonces el articulo (como el enunciado lo dice ) no tiene que ir agrupado.
digamos que vendio A0001 3 veces
Ventas del Dia:dd/mm/aaaa
DNI:11.111.111z Nombre: cliente
Direccion: Poblacion: Provincia:
codigo - cantidad - precio - valor
A0001 1 10 10
A0001 10 10 100
A0001 100 100 10000
total: 11100
segun entiendo lo que deberias hacer serian dos consultas, una para cabecera y pie de reporte y la otra para sacar el detalle de la venta.
Para cabecera
Select cl.dni, cl.nombre, cl.direccion, cl.poblacion, cl.provincia, sum(v.cantidadvendida*a.precio) TOTAL
From articulos a, ventas v, clientes cl
WHERE cl.dni=v.dni
And a.codigo=v.codigo
Group by cl.dni, cl.nombre, cl.direccion, cl.poblacion, cl.provincia, a.descripcion
Order by v.codi,a.descripcion
para detalle
Select v.codigo, a.descripcion, v.cantidadvendida, a.precio, (v.cantidadvendida*a.precio) valor
From articulos a, ventas v, clientes cl
WHERE cl.dni=v.dni And a.codigo=v.codigo
Order by v.codi,a.descripcion;
claro que esta incompleto, porque nose como manejar las cosas en oracle, pero creo que todo lo demas que tienes de codigo es para dejar un cliente en una sola pagina, porque en estas dos consultas se toman todos los clientes, y no sabemos quien en quien en la de detalle, creo que seria necesario en la consulta de detalle colocar solamente el codigo del cliente, y asi en el reporte hacer la agrupacion,en los reportes que yo suelo usar puedes agrupar datos pero no como hace el group by.
En la consulta hay mas de un codigo de cliente (en las dos consultas), y al agruparlos en el reporte, alli se separan, nose si me entiendes?
que gestor para reportes usas ? oracle ya tiene el suyo?
a menos que filtres el cliente que quieres ver en el where
WHERE v.dni=0001
porque con el
WHERE cl.dni=v.dni
tomas todos los clientes
salu2
BREAK ON dni skip page -> Esto es para que cada pagina muestre las ventas de cada cliente, ya que el enunciado dice: "Con una pagina por cliente..."
COMPUTE SUM LABEL 'SUMA' OF TOTAL ON PAGE-> esto es para que haga un SUM en cada Break, es decir en cada pagina hara un SuM, el cual aparecera al final de cada pagina, es decir, que sumara lo que se ha vendido al cliente.
Vaya lio que llevo ya.
haber si nos aclaramos.
Cada pagina se mostrara asi:
Pagina1:
---------
Ventas del Dia:22/04/09
DNI:11.111.111z Nombre: JOSE MORENO
Direccion: Balmes,3 Poblacion:madrid Provincia:madrid
VENTAS:
CODIGO DESCRIPCION CANTIDAD PRECIO TOTAL
A0001 ArTICLE1 4 15,00 60,00
A0005 ArTICLE5 7 5,00 35,00
A0015 ArTICLE15 2 20,00 40,00
SUMA 135,00
Pagina 2
----------
Ventas del Dia:23/04/09
DNI:22.333.111B Nombre: LUIS PUENTES
Direccion: zzzzzz Poblacion:BARCELONA Provincia:barcelona
VENTAS:
CODIGO DESCRIPCION CANTIDAD PRECIO TOTAL
A0006 ArTICLE6 5 5,00 30,00
A0008 ArTICLE8 5 10,00 50,00
A0013 ArTICLE13 3 20,00 60,00
SUMA 140,00
Fijate que los datos(ventas del dia, dni, nombre) van cambiando segun el cliente.Y asi para todos los clientes.
Hay alguna forma para que kede una select, siguiendo el primer modelo que puse??
Me puedes decir si esta otra select esta bien?
Con las siguientes tablas:
Alumnos(DNI, nombre,dirección,población,dpostal,provincia,curso,grupo)
Asignaturas(CODIGO,nombre,profesor,grupo)
Notas(dni,código,eval,nota)
Formato:
DNI NOMBRE CODIGO ASIGNATURA NOTA _MEDIANA
---------------------------------------------------------------------------------
SELECT al.dni, al.nombre, as.codigo,as.nombre,AVG(n.nota) nota_mediana
From alumnos al, asignaturas as, notas n
WHERE al.dni=n.dni
And as.codigo=n.codigo
GROUP BY al.dni, al.nombre, as.codigo,as.nombre
ORDER BY al.dni;
Muchas Gracias.
hola de nuevo.
pues segun entiendo en el enunciado, las ventas no seran agrupadas, por lo tanto deberias quitar el sum( ) de tu consulta original. y eliminar el group by .
el sum( ) hasta donde entiendo no lo necesitas porque ya estas opteniendo el total de cada pagina con el
Citar
COMPUTE SUM LABEL 'SUMA' OF TOTAL ON PAGE
ahora, en ambos ejemplos me das un ejemplo con codigos no repetidos, cuando en el enunciado dice que si se podran repetir :P pero bueno, creo que solo es un ejemplo ^^
lo otro que pones de alumno esta bien ;)
salu2
Siento molestarte de nuevo, pero te prometo que este sera el ultimo.
Con las siguientes tablas:
Alumnos(DNI, nombre,dirección,población,dpostal,provincia,curso,grupo)
Asignaturas(CODIGO,nombre,profesor,grupo)
Notas(dni,código,eval,nota)
2-Escribe las instrucciones necsarias para imprimir el boletín de notas de cada alumno en una evaluación determinada.
Los valores posibles de campo eval(evaluación) son:1,2,3...
SET ECHO OFF
SET VERIFY OFF
DEFINE evaluación
DEFINE alumno
Break on dni skip page
Compute avg of sum(n.nota) on page
Column eval noprint new_value vneval
Column dni noprint new_value vadni
Column nombre noprint new_value vanombre
Column curso noprint new_value vacurso
Column grupo noprint new_value vagrupo
TTI center 'Boletin de notas de la evaluacion' vneval skip 1
'DNI:'vadni 'Nombre:' vanombre 'Curso:'vacurso 'Grupo:'vagrupo skip 2
Left 'Asignaturas:'
Select n.eval, a.dni,a.nombre, a.curso,a.grupo,as.codigo, as.nombre,n.nota
From alumnos a,notas n , asignaturas as
Where a.dni=n.dni
And as.codigo=n.codigo
And n.eval=&evaluación
And n.nombre=&alumno
Order by a.dni
Ya me diras si esta correcto, o como lo haria tu.
Graciassss
creo que en la parte
CitarAnd n.nombre=&alumno
seria And n.dni = &alumno, porque el campo nombre no existe en la tabla notas
asumo que en &alumno iria el codigo del alumno.
por cierto, no me molestas :P para eso es el foro ^^
salu2