Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Articulos no vendidos por cliente (https://www.clubdelphi.com/foros/showthread.php?t=90989)

itsspxndx 21-10-2016 00:27:44

Articulos no vendidos por cliente
 
Buenos dias o buenas tardes amigos. Necesito apoyo de este foro, vengo trabajando sobre una consulta que parece ser muy sencillo pero por mas que le busco, aun no logro concretarlo bien.
Lo que necesito es llamar todos los articulos no vendidos pero por cada cliente, Mis tablas son la siguiente (solo puse campos necesario):

tabla que almacenan todos los artículos
ARTICULOS
articulo_id
Nombre

tabla que almacena los movimientos vendidos de cada articulo
DOCTO_VE_DET
docto_ve_det_id
docto_ve_id
articulo_id

tabla que almacena los documentos ligados con los movimientos y clientes
DOCTO_VE
docto_ve_id
cliente_id

codigo que he realizado
Código SQL [-]
FOR SELECT A.ARTICULO_ID
FROM ARTICULOS A
LEFT JOIN DOCTOS_VE_DET B
ON B.ARTICULO_ID = A.ARTICULO_ID
LEFT JOIN DOCTOS_VE C
ON C.DOCTO_VE_ID = B.DOCTO_VE_ID
AND C.CLIENTE_ID = 18634 (id de un cliente de ejemplo)
WHERE B.ARTICULO_ID IS NULL
INTO ARTICULO_ID
DO SUSPEND;

Pero no me ha funcionado, siempre me llama a todos los articulos sin respetar al cliente que he referenciado.
:(¿Alguien puede ayudarme por favor? :( :( :(

bucanero 21-10-2016 16:29:46

Hola

Intenta con esta consulta

Código SQL [-]
select cliente_id,  articulos.*
-- RELACION COMPLETA DE CLIENTES Y ARTICULOS
from (docto_ve, articulos)
WHERE NOT (cliente_id, articulo_id) IN (
  -- RELACION DE ARTICULOS POR CLIENTE
  select cliente_id, articulo_id
  from docto_ve
  inner join docto_ve_det on docto_ve_det.docto_ve_id=docto_ve.docto_ve_id
  group by cliente_id, articulo_id
)
GROUP BY cliente_id, articulo_id

IMPORTANTE: Solo te devolvera los clientes que tengan compras, si quieres incluir todos los clientes sustituye "docto_ve" del from principal por la tabla de clientes.

Espero que te sirva
Un saludo

bucanero 21-10-2016 16:36:17

La respuesta anterior esta implementada para MySQL, si no es este tu motor de BD tendrás que aplicar la forma IN con multicampos a tu respectivo motor, o puedes usar esta otra forma donde ya no esta el IN

Código SQL [-]
select docto_ve.cliente_id,  articulos.*
-- RELACION COMPLETA DE CLIENTES Y ARTICULOS
FROM (docto_ve, articulos)
LEFT join (
  -- RELACION DE ARTICULOS POR CLIENTE
  select cliente_id, articulo_id
  from docto_ve
  inner join docto_ve_det on docto_ve_det.docto_ve_id=docto_ve.docto_ve_id
  group by cliente_id, articulo_id
) dat ON dat.cliente_id=docto_ve.cliente_id  AND dat.articulo_id=articulos.articulo_id
WHERE dat.articulo_id is NULL
GROUP BY docto_ve.cliente_id, articulos.articulo_id

Un saludo


La franja horaria es GMT +2. Ahora son las 07:10:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi