Conteggio in tabella Pivot
Hai un problema con Excel? 
Conteggio in tabella Pivot
di Leru (utente non iscritto) data: 26/07/2017 09:25:03
Ciao a tutti,
sto cercando di fare un report sulle vendite utilizzando una tabella Pivot, ho un file excel contenente i seguenti campi:
Ragione sociale Cliente - Tipologia - Data ordine
Ora, quello che vorrei riuscire ad estrapolare è sapere quanti clienti, di una determinata tipologia (es. quanti bar), hanno acquistato in un anno. Tenete conto che un cliente di tipo bar può aver fatto più di un ordine durante l'anno, ma conta sempre come 1.
Quindi vorrei dalla pivot che mi dicesse, nel 2017, quanti bar, ristoranti, pub ecc. hanno acquistato (quindi ad esempio alla fine avrò 23 bar, 44 ristoranti, ecc, questi conteggi indipendentemente da quanti ordini ogni singolo cliente appartenente ad una determinata Tipologia abbia fatto).
Spero di essermi spiegato e che possiate darmi una mano. Grazie mille.
di Vecchio Frac data: 26/07/2017 18:51:29
Sarebbe utile un file di esempio con uno scenario già impostato (dati fittizi ovviamente).
di Leru (utente non iscritto) data: 27/07/2017 15:44:24
Ciao, innanzi tutto grazie per l'interessamento. Allego un file di esempio contente un esempio del file origine e di quello che vorrei ottenere da excel.
Grazie mille per il tuo tempo, spero mi possa aiutare.
di Vecchio Frac data: 27/07/2017 19:04:10
Il file Excel di esempio non è coerente con la spiegazione iniziale:
- la base dati non contiene la data. Quindi non si può estrapolare questa informazione;
- ti serve differenziare anche per cliente? o basta raggruppare per tipologia?
- nell'esempio ci sono 5 bar, 1 pub e 13 ristoranti ma la tabellina riassuntiva inserita per riprova ci riporta che nel 2017 sono stati serviti 1 bar, 5 ristoranti e 1 pub.
Possibile soluzione
di CarlettoFed (utente non iscritto) data: 27/07/2017 19:43:22
Ti allego una possible soluzione, se ho capito bene ciò che volevi.
di Vecchio Frac data: 27/07/2017 21:22:41
@CarlettoFed
A parte aver riordinato alfabeticamente la tabella per tipologia, mi è totalmente oscuro il passaggio del risultato a cui sei arrivato, che non riesco a interpretare.
Come può la tipologia "Bar" produrre un risultato "1" sia nella colonna "Fatturato 2016" che in quella "Fatturato 2017"?
A meno che la versione del file (.xls) non si sia mangiata qualcosa, non vedo nemmeno una tabella pivot.
Insomma, io non capisco niente dello scenario nè della richiesta nè della soluzione proposta... sto invecchiando più rapidamente del previsto :)
Risposta
di CarlettoFed (utente non iscritto) data: 27/07/2017 21:58:40
Scusa ma debbo essermi sbagliato ad allegare il file, rimedio subito.
L'ordinamento facilita il lavoro se ti da fastidio si può comunque cambiare il codice.
di Vecchio Frac data: 27/07/2017 22:12:56
Ho guardato l'allegato e ok, il risultato è come richiesto, però io non ho capito nè la logica nè il criterio.
di Leru (utente non iscritto) data: 28/07/2017 09:30:30
Allora prima di tutto grazie per il vostro tempo dedicato al mio problema. Secondariamente, grazie CarlettoFed per l'esempio fornito, dà la soluzione da me cercata, ma non riesco a capire la formula/macro utilizzata, così non posso utilizzarla nel mio lavoro. Puoi darmi delucidazioni?
Per Vecchio Frac, io ho una tabella con vari ordini effettuati durante l'anno, e ho bisogno sapere quanti clienti di una determinata tipologia sono stati attivati durante l'anno. Il problema nasce che essendoci più ordini dello stesso cliente durante l'anno, ho bisogno appunto di una formula/calcolo che conti gli abbinamenti univoci tra Tipologia/Cliente non considerando i "duplicati" (se il bar mario fa 4 ordini durante l'anno, bar luigi 8 e bar sergio 12, alla fine io ho sempre servito 3 bar, indipendentemente dal numero di ordini che questi hanno fatto).
Spero di aver chiarito ulteriormente, grazie ancora.
di Leru (utente non iscritto) data: 28/07/2017 11:08:25
Allora CarlettoFed ha risolto tutti i miei problemi, il suo foglio non solo è corretto, ma è utilizzabile inserendo i valori del mio foglio in quanto gli ha dato/costruito la regola valida tutte le righe del foglio quindi posso mettere dati all'infinito. Oltre a ringraziarti immensamente per la tua gentilezza e disponibilità, sono curioso, hai usato una macro precompilata oppure hai scritto tu il codice da 0? Sei un programmatore?
Grazie ancora, veramente.
di Vecchio Frac data: 28/07/2017 12:05:17
Io credo di aver capito solo dopo aver spulciato il codice di CarlettoFed ^^ (è un raggruppamento con conteggio per tipologia e anno dei codici solo se <> da zero)
Non so come ha fatto senza adeguate spiegazioni ma deve avere avuto una palla di vetro per capire il problema e la richiesta ^_^
di Vecchio Frac data: 28/07/2017 14:47:27
Ormai è risolta ma io io avrei pensato a una soluzione alternativa interrogando la tabella dati con una piccola query ADO che restituisce i dati richiesti sotto forma di recordset. Non sono riuscito a realizzare una query unica (magari con TRANSFORM) quindi devo realizzarne due, una per ogni fatturato, ma è snella e compatta e una volta ottenuti i risultati si può ciclare nel recordset per visualizzarli dove si vuole.
SELECT tipologia, Count(*) AS [Fatturato 2016]
FROM
(SELECT tipologia, cliente
FROM tabella1
WHERE [fatturato 2016] > 0
GROUP BY tipologia, cliente)
GROUP BY tipologia
di Vecchio Frac data: 28/07/2017 15:48:32
Insomma ne risulterebbe un codice più compatto.
Option Explicit
Sub group_via_ADO()
Dim cn As Object
Dim rs As Object
Dim sConn As String
Dim sql As String
Dim t As String
Dim v As Variant
Dim i As Integer
Dim p As Variant
sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open sConn
t = Range("B3:E22").Address(0, 0)
sql = "SELECT tipologia, Count(*) AS %1 " & _
" FROM " & _
" (SELECT tipologia, cliente " & _
" FROM [$" & t & "] " & _
" WHERE %1 > 0 " & _
" GROUP BY tipologia, cliente) " & _
" GROUP BY tipologia"
rs.Open Replace(sql, "%1", "[Fatturato 2016]"), cn, 3 'adOpenStatic
Range("J3:M30").ClearContents
Range("J3").CopyFromRecordset rs
rs.Close
rs.Open Replace(sql, "%1", "[Fatturato 2017]"), cn, 3 'adOpenStatic
p = rs.getrows
For i = 0 To 2
Cells(3 + i, "L") = p(1, i)
Next
cn.Close
End Sub |
Vuoi Approfondire?