Newsgroup: it.comp.lang.visual-basic
Titolo: HELP!Ricerca su tabella CROSS

Ho tre tabelle, una con i CLIENTI, l'altra con i PRODOTTI,
e una tabella di cross del tipo
cod cliente| codice prodotto
-------------------
cliente1    |prodotto1
cliente1    |Prodotto2
cliente2    |prodotto1
cliente3    |Prodotto2
come faccio ad elencare i clienti che hanno acquistato 2 o piu tipi di
prodotti diversi,
NB: (devono averli acquistati tutti)
...sono agli sgocciol....(come sempre)
nicoletta



Se ti servono solo i clienti (vado a memoria, comunque all'incirca dovrebbe
essere giusta):
select max(clienti.cod_cliente) cliente, count(prodotti.codice_prodotto)
totale from clienti clienti join prodotti prodotti
on clienti.cod_cliente=prodotti.cod_cliente where
count(prodotti.codice_prodotto)>1 group by prodotti.cod_cliente

e se mi serve l'elenco dei clienti a partire da un elenco di codici prodotto
definito, quindi senza calcolo del totale dei prodotti, ma solo i clienti che
ad esempio hanno comprato quei tipi di prodotto??
..lo so sono stata poco chiara
nicoletta


 ad esempio hanno comprato quei tipi di prodotto??
Sarebbe come dire un "Elenco dei prodotti (tutti i prodotti? solo quelli che
sono stati acquistati?) (ordinati per... marca, codart,...) con l'elenco,
per ciascun prodotto, dei clienti (ordinati per... nome, provincia,
categoria...) che li hanno acquistati (con o senza la quantita' acquistata,
e magari per
periodo, stagione, confezione...)?
Tutte le vendite:
SELECT PRODOTTI.NOME, CLIENTI.NOME, VENDITE.QTA
FROM (PRODOTTI LEFT JOIN VENDITE ON PRODOTTI.COD = VENDITE.CODART) LEFT JOIN
CLIENTI ON VENDITE.CODCLI = CLIENTI.COD;
Tutti gli acquirenti:
SELECT DISTINCT PRODOTTI.NOME, CLIENTI.NOME
FROM (PRODOTTI LEFT JOIN VENDITE ON PRODOTTI.COD = VENDITE.CODART) LEFT JOIN
CLIENTI ON VENDITE.CODCLI = CLIENTI.COD;
DISTINCT saluti.
Maurizio

 388DAF79...@libero.it...


 trovo i clienti che ne hanno acquistato almeno uno...
AND!
CROSS
-----
PIPPO    001
PIPPO    234
PIPPO    400
PLUTO    234
PAPERINO 001
PAPERINO 400
Il risultato dovrebbe essere solo PIPPO. Giusto? Bene, perdonami ma vado di
fretta per cui, "barando", creo la tabella:
TAB1
----
001
234
400
con, appunto i dati che sto cercando, poi:
SELECT DISTINCTROW CLIENTI.NOME
FROM ((TAB1 LEFT JOIN VENDITE ON TAB1.CODART = VENDITE.CODART) LEFT JOIN
PRODOTTI ON VENDITE.CODART = PRODOTTI.COD) LEFT JOIN CLIENTI ON
VENDITE.CODCLI = CLIENTI.COD
GROUP BY CLIENTI.NOME
HAVING (((Count(CLIENTI.NOME))=3)); '// Dove '3' e' il numero dei record di
TAB1.
Ciao.
Maurizio

giustissimo...
Non solo funziona, ma mi hai veramente illuminato ... sull'sql!
:-))))
nicoletta


di fretta per cui, "barando", creo la tabella:
[...]
CLIENTI
============
COD NOME
--- --------
001 PIPPO
002 PLUTO
003 PAPERINO
PRODOTTI
========
COD
---
001
...
999
VENDITE
=============
CODCLI CODART
------ ------
001    001
001    234
001    400
002    234
003    001
003    400
MIX
======
CODART
------
001
234
400
SELECT DISTINCTROW CLIENTI.NOME
FROM MIX LEFT JOIN (VENDITE LEFT JOIN CLIENTI ON VENDITE.CODCLI =
CLIENTI.COD) ON MIX.CODART = VENDITE.CODART
GROUP BY CLIENTI.NOME
HAVING (((Count(CLIENTI.NOME))=DCount("[CODART]","MIX")));
Oppure, meglio, con una sottoquery, che dovrebbe essere piu' veloce oltre
che slegata dall'uso esclusivo in Access come DCount:
[Come sopra meno l'ultima riga]
HAVING (((Count(CLIENTI.NOME))=(SELECT Count([CODART]) FROM MIX)));
Ciao.
Maurizio

OK!
grazie grazie grazie
;-)))))))))))
nicoletta