Como hacer una consulta en access sql

Tengo 2 tablas

Cliente: id, nombre_cliente, rfc, ciudad

compra; id_compra, nombre_cliente, monto, año_compra, nombre_tienda

Lo que quiero es que un cuadro combinado me muestre el nombre de los clientes de determinada ciudad (ejemplo mérida) que su ultimo año_compra sea después del 2019

Y otro cuadro combinado que me muestre nombre_cliente de los que su ciudad no es mérida (por ejemplo) y que su ultima compra fue de un monto mayor a $100.00 x ejemplo

3 Respuestas

Respuesta
1

Yo no comparto la opinión de Icue de que te sobra el id_compra en esa tabla, pues es buena práctica tener un identificador único de cada registro en la tabla, además, de que agiliza las búsquedas en la tabla.

En lo que sí coincido con él es en que la relación entre las tablas debería ser del campo id de la tabla cliente al campo "nombre_cliente" (y mejor usar otro nombre para no confundirlos) de la tabla compras, pero nunca deberías relacionar los dos campos nombre_cliente.

En cuanto a las SQLs, la primera sería (suponiendo que la relación es entre id y nombre_cliente):

SELECT clientes.nombre_cliente, clientes.ciudad, compra.año_compra
FROM clientes INNER JOIN compra ON clientes.id = compra.nombre_cliente
WHERE (((clientes.ciudad)="Mérida") AND ((compra.año_compra)>2019));

Y la segunda:

SELECT Clientes.Nombre_cliente, Clientes.Ciudad, Compra.año_compra, Compra.monto
FROM Clientes INNER JOIN Compra ON Clientes.ID = Compra.nombre_cliente
WHERE (((Clientes.Ciudad)<>"Mérida") AND ((Compra.año_compra)=(SELECT Max(Compra.año_compra) AS Ultimo FROM Compra GROUP BY Compra.[nombre_cliente] HAVING (((Compra.[nombre_cliente])=[ID])) )) AND ((Compra.monto)>100));

Si la relación es de nombre_cliente a nombre-cliente, serían parecidas:

SELECT clientes.nombre_cliente, clientes.ciudad, compra.año_compra
FROM clientes INNER JOIN compra ON clientes.nombre_cliente = compra.nombre_cliente
WHERE (((clientes.ciudad)="Mérida") AND ((compra.año_compra)>2019));
SELECT Clientes.Nombre_cliente, Clientes.Ciudad, Compra.año_compra, Compra.monto
FROM Clientes INNER JOIN Compra ON Clientes.nombre_cliente = Compra.nombre_cliente
WHERE (((Clientes.Ciudad)<>"Mérida") AND ((Compra.año_compra)=(SELECT Max(Compra.año_compra) AS Ultimo FROM Compra GROUP BY Compra.[nombre_cliente] HAVING (((Compra.[nombre_cliente])=[ID])) )) AND ((Compra.monto)>100));

Muchas gracias por la ayuda

Pero si quisiera consultar así

Tengo 10 clientes, de los cuales solo 4 de ellos han comprado en la tienda de mérida después del 2019

¿Cómo le puedo hacer para que me muestre todos los clientes de la tabla clientes menos los que su ultima compra sea de mérida después del 2019?

Lo intento pero no me salen

Con la primera SQL que te indiqué, tienes los que compraron en Mérida después de 2019. Si haces con el asistente una consulta de no coincidentes (de la tabla clientes y la consulta) ya lo tienes. Otra forma sería con una subconsulta, algo así:

SELECT * FROM clientes WHERE clientes.id NOT IN (SELECT clientes.id 
FROM clientes INNER JOIN compra ON clientes.id = compra.nombre_cliente
WHERE (((clientes.ciudad)="Mérida") AND ((compra.año_compra)>2019)));

Y aún habría alguna otra forma de sacar esos resultados.

Respuesta
1

tendrías que hacer un join y agregar las condiciones adicionales al where

Respuesta
1

Primero, yo no pondría el nombre del cliente en la segunda tabla, tampoco pondría el idcompra, ya que el valor que de verdad interesa te lo va a dar el Idcliente. Las dejaría como Idcliente, nombrecliente, ciudad y RFC(no lo he puesto porqué no se´que es) y la segunda tabla IDcliente(numñerico), monto, año y Tienda, relacionadas ambas por Idcliente UN Cliente VARIAS Compras.

Si tengo la tabla

Y la tabla Tabla1

Con ellas construyo una consulta

Que es lo que dices en el primer punto

Para el segundo punto

Al abrirla

Entonces, en el origen de control del combinado, le pones Consulta1 ó Consulta 2 o bien, dejas el origen del control en blanco y en Origen de la fila, con el generador "reproduces" las consultas de arriba.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas