PDA

View Full Version : [SQL] Una query che non riesco a risolvere


zanardi84
11-01-2013, 16:13
Ho una vista ottenuta da precedenti query così composta

Cliente Prodotto

(es in cui riporto alcune tuple: 1 auto, 1 casa, 2 auto, 1 casa... )

Devo calcolare quante volte il cliente ha comprato il prodotto. In questo caso dovrei ottenere ad esempio che 1 ha comprato casa 2 volte.

RaouL_BennetH
11-01-2013, 16:26
Ciao :)

hai provato con:


select count(distinct Prodotto) where Cliente = 1


?

oppure se per un prodotto specifico:

select count(Prodotto) where Cliente = 1 and Prodotto = 'casa'

wingman87
11-01-2013, 17:10
Sono un po' arruginito ma ci provo...

select Cliente, Prodotto, count(Prodotto)
from vista
groupby(Cliente,Prodotto)

zanardi84
11-01-2013, 17:33
Ciao :)

hai provato con:


select count(distinct Prodotto) where Cliente = 1


?

oppure se per un prodotto specifico:

select count(Prodotto) where Cliente = 1 and Prodotto = 'casa'


La prima mi sembra che si riferisce ad un cliente specifico, cioè 1. O sbaglio?





Sono un po' arruginito ma ci provo...

select Cliente, Prodotto, count(Prodotto)
from vista
groupby(Cliente,Prodotto)


Non posso fare il doppio raggruppamento con il count.. MySQL si lamenta.


Inviato dal mio ASUS Transformer Pad TF300T con Tapatalk 2

wingman87
11-01-2013, 17:44
Potrei anche aver sbagliato la sintassi, ma credo che il raggruppamento su più colonne non sia un problema

zanardi84
11-01-2013, 17:49
Potrei anche aver sbagliato la sintassi, ma credo che il raggruppamento su più colonne non sia un problema

Forse è la combinazione con il count in target list che non va.

Inviato dal mio ASUS Transformer Pad TF300T con Tapatalk 2

RaouL_BennetH
11-01-2013, 18:02
boh, quella di wignman87 per me è corretta:


select cliente, prodotto, count(prodotto) as ordered from tua_vista
group by cliente, prodotto


cliente prodotto ordered
1 auto 3
2 auto 1
1 casa 2
2 casa 1

zanardi84
12-01-2013, 09:28
Funziona, il raggruppamento che mi avete suggerito è corretto e adesso sono pure riuscito ad evitare la vista. La questione dei due attributi era relativa al fatto che non dovevano essere messi tra parentesi tonde.

Ora vorrei uno step in più: supponiamo di avere una tabella cliente con codice, nome, abituale. Per i clienti che hanno acquistato più volte un prodotto, cioè quelli per cui il count produce un risultato mettiamo superiore a 10, la colonna abituale deve assumere il valore "sì", una semplice stringa (ma potrebbe anche essere un boolean, a me interessa il comando). Riferendomi ancora alla vista, ammesso che sia possibile usarla per questa operazione

Ho scritto il comando update ma non mi funziona.

update cliente
set abituale = "sì"
where codice in (select cliente from vista group by cliente, prodotto having count(*) > 10)

zanardi84
12-01-2013, 09:31
Sembra tutto risolto: ho usato l'operatore in in accordo con la regola che vuole che dalla query di estrazione risulti un insieme, anche di un solo elemento, invece di una sola tupla.
Perchè devo usare l'operatore = in questo caso?