Discussione:
Estrarre dati che danno una certa somma da Excel, Access o SQL Server
(troppo vecchio per rispondere)
Asheric
2006-09-02 05:19:13 UTC
Permalink
Buongiorno a tutti,
ho il seguente problema: ho una lista di valori la cui somma è pari ad un
certo numero (es. 5326,57). Fra questi valori, voglio evidenziare quelli la
cui somma è il più vicino possibile ad un certo valore (per esempio 500).
Esiste un modo per farlo, in Excel, Access o SQL Server?

Grazie
Michele (Giò)
2006-09-02 08:42:32 UTC
Permalink
Post by Asheric
Buongiorno a tutti,
ho il seguente problema: ho una lista di valori la cui somma è pari ad un
certo numero (es. 5326,57). Fra questi valori, voglio evidenziare quelli
la cui somma è il più vicino possibile ad un certo valore (per esempio
500). Esiste un modo per farlo, in Excel, Access o SQL Server?
Grazie
Non ho ben capito in che maniera rendi disponibili questi dati, ma penso che
una buona soluzione sia una
bella procedura ricorsiva che provi ad eseguire prima la selezione di tutti
i valori vicini a 500, popi tutte le
somme possibili partendo da due addendi fino a tutti gli addendi. Si
caricano i risultati in una tabella e poi da lì
ti giostri come vuoi. Certo è da studiare un bel sistema per risalire, una
volta individuati i risultati, quali erano gli
addendi che lo hanno generato, certo tutto sta a sapere di quanti addendi
stiamo parlando (10, 100, 1000, di più)?

Saluti

Michele
Alessandro Baraldi
2006-09-02 11:28:54 UTC
Permalink
Post by Asheric
Buongiorno a tutti,
ho il seguente problema: ho una lista di valori la cui somma è pari ad un
certo numero (es. 5326,57). Fra questi valori, voglio evidenziare quelli la
cui somma è il più vicino possibile ad un certo valore (per esempio 500).
Esiste un modo per farlo, in Excel, Access o SQL Server?
Grazie
Innanzitutto credo ci sia un minimo di confusione in quanto dici...!
Excel, Access e SQL_Server sono 3 cose troppo diverse per compararle.

SQL_Server non ha interfaccia utente, è solo un RDBMS(interfacciabile
con Access)
Access è composto da JET+Access(interfaccia)
Excel proprio non è un Database, e qui è decisamente OT

Con Access fare quello che chiedi è semplice, basta realizzare una
Query nella quale
crei un Campo di tipo Boolean(True/False) che confronta la Somma con il
tuo NumeroRiferimento:

Se Abs(Somma-NumeroRiferimento)<Range Campo=Vero
che tradotto:

NomeCampo:IIF(Abs(Somma-NumeroRiferimento)<Range;True;False)

Ora in una Maschera a visualizzazione continua abiliti la formattazione
Condizionale
che prenderà in considerazione il Campo creato nella Query "NomeCampo"
ed applicherà
per NomeCampo=True la formattazione ai controlli che hai destinato...!

@Alex
Asheric
2006-09-02 12:00:24 UTC
Permalink
Ciao,
grazie per la risposta ma non ho capito bene oppure mi sono spegato male
io:-)
praticamente io ho una lista di codici con adiacente un valore

es:
Codice Valore
ADF 10
ASF 5
ARG 15
AWQ 20

Somma totale 50

Devo trovare i codici che sommando il rispettivo valore mi danno per esempio
25

Nell'esempio specifico 25 è dato sia dalla somma del 1° e 3° codice, sia
dalla somma del 2° e 4° codice.

Per me è indifferente che la query restituisca la somma del 1°+3° piuttosto
che la somma del 2°+4°, l'importante è che mi evidenzi i codici di una delle
due combinazione che hanno formato 25.

Non so se mi sono spiegato bene...è un pò complessa (almeno per me) come
richiesta.

Grazie
Post by Asheric
Buongiorno a tutti,
ho il seguente problema: ho una lista di valori la cui somma è pari ad un
certo numero (es. 5326,57). Fra questi valori, voglio evidenziare quelli la
cui somma è il più vicino possibile ad un certo valore (per esempio 500).
Esiste un modo per farlo, in Excel, Access o SQL Server?
Grazie
Innanzitutto credo ci sia un minimo di confusione in quanto dici...!
Excel, Access e SQL_Server sono 3 cose troppo diverse per compararle.

SQL_Server non ha interfaccia utente, è solo un RDBMS(interfacciabile
con Access)
Access è composto da JET+Access(interfaccia)
Excel proprio non è un Database, e qui è decisamente OT

Con Access fare quello che chiedi è semplice, basta realizzare una
Query nella quale
crei un Campo di tipo Boolean(True/False) che confronta la Somma con il
tuo NumeroRiferimento:

Se Abs(Somma-NumeroRiferimento)<Range Campo=Vero
che tradotto:

NomeCampo:IIF(Abs(Somma-NumeroRiferimento)<Range;True;False)

Ora in una Maschera a visualizzazione continua abiliti la formattazione
Condizionale
che prenderà in considerazione il Campo creato nella Query "NomeCampo"
ed applicherà
per NomeCampo=True la formattazione ai controlli che hai destinato...!

@Alex
Michele (Giò)
2006-09-02 12:20:47 UTC
Permalink
Post by Asheric
Ciao,
grazie per la risposta ma non ho capito bene oppure mi sono spegato male
Forse sono io che non riesco a capire bene. Innanzitutto ci devi dire se
questa somma deve essere obbligatoriamente
ottenuta prendendo solo coppie di valori oppure se è lecito prenderne 1 o
più di 2 (fino a tutti se necessario)

Seconda cosa ci devi dire quanto è lunga questa lista di valori, se i valori
rimarranno sempre gli stessi o se cambieranno.

E soprattutto, in uscita, vuoi una lista di valori, o vuoi una tabella dove
magari affiancati ai valori ci sia una casella Si/No che marcherà la
selezione del record?

Devi essere più esauriente

Michele
Alessandro Baraldi
2006-09-02 12:27:01 UTC
Permalink
Post by Asheric
Ciao,
grazie per la risposta ma non ho capito bene oppure mi sono spegato male
io:-)
praticamente io ho una lista di codici con adiacente un valore
Codice Valore
ADF 10
ASF 5
ARG 15
AWQ 20
Somma totale 50
Devo trovare i codici che sommando il rispettivo valore mi danno per esempio
25
Nell'esempio specifico 25 è dato sia dalla somma del 1° e 3° codice, sia
dalla somma del 2° e 4° codice.
Per me è indifferente che la query restituisca la somma del 1°+3° piuttosto
che la somma del 2°+4°, l'importante è che mi evidenzi i codici di una delle
due combinazione che hanno formato 25.
Non so se mi sono spiegato bene...è un pò complessa (almeno per me) come
richiesta.
Grazie
Allora non ho capito cosa aveva a che vedere Excel e biglie varie.....!

E se fossero 3 i records da sommare per ottenere 25....?

Le specifiche che hai dato sono troppo generiche, implementare una
funzione
che cicla il Recordset alla ricerca di un record piuttosto che di N i
quali sommati
danno 25(XX per generalizzare) è decisamente diversa...., credo che
tra le altre
cose, per motivi di velocità non convenga lavorare con Recordset, ma
direttamente con
una Matrice precaricata in memoria con i valori ricavati dal
Recordset...!

In sostanza si tratta di ciclare la Matrice, che io farei
Mondimensionale ma su una
variabile di Tipo:

Private Type MyField
ID_PK As Long
Valore As TuoTipoDato
End Type

Private mt() as MyField

Ora la carichi ciclando il Recordset, quindi inizi l'algoritmo di
calcolo partendo dal primo
all'ultimo, poi dal 2° all'ultimo, poi dal 3° all'ultimo....sempre
che tu non voglia ipotizzare la somma di N records come ti dicevo
prima....!

@Alex
Michele (Giò)
2006-09-02 12:42:59 UTC
Permalink
Post by Asheric
Ciao,
grazie per la risposta ma non ho capito bene oppure mi sono spegato male
io:-)
praticamente io ho una lista di codici con adiacente un valore
Codice Valore
ADF 10
ASF 5
ARG 15
AWQ 20
Somma totale 50
Devo trovare i codici che sommando il rispettivo valore mi danno per esempio
25
Nell'esempio specifico 25 è dato sia dalla somma del 1° e 3° codice, sia
dalla somma del 2° e 4° codice.
Per me è indifferente che la query restituisca la somma del 1°+3° piuttosto
che la somma del 2°+4°, l'importante è che mi evidenzi i codici di una delle
due combinazione che hanno formato 25.
Non so se mi sono spiegato bene...è un pò complessa (almeno per me) come
richiesta.
Grazie
Allora non ho capito cosa aveva a che vedere Excel e biglie varie.....!

E se fossero 3 i records da sommare per ottenere 25....?

Le specifiche che hai dato sono troppo generiche, implementare una
funzione
che cicla il Recordset alla ricerca di un record piuttosto che di N i
quali sommati
danno 25(XX per generalizzare) è decisamente diversa...., credo che
tra le altre
cose, per motivi di velocità non convenga lavorare con Recordset, ma
direttamente con
una Matrice precaricata in memoria con i valori ricavati dal
Recordset...!

In sostanza si tratta di ciclare la Matrice, che io farei
Mondimensionale ma su una
variabile di Tipo:

Private Type MyField
ID_PK As Long
Valore As TuoTipoDato
End Type

Private mt() as MyField

Ora la carichi ciclando il Recordset, quindi inizi l'algoritmo di
calcolo partendo dal primo
all'ultimo, poi dal 2° all'ultimo, poi dal 3° all'ultimo....sempre
che tu non voglia ipotizzare la somma di N records come ti dicevo
prima....!

@Alex

nel caso di N records, una soluzione potrebbe anche essere quella di
utilizzare una variabile long ogni 30 records (per esempio, 80 records, 3
variabili) ed utilizzare il singolo bit come marcatore per ogni record. Per
esempio, se abbiamo 25 records, e il contatore incrementale di uno è
arrivato al numero 11256, significa che:

11256 binario 10101111111000

Cioè il numero 11256 corrisponderà alla somma dei records che hanno il bit
postato a 1, cioè il n. 4,5,6,7,8,9,10,12 e 14

Così si è sicuri, una volta arrivati a 2^26-1 (che sarà l'ultimo valore per
l'incremento, 67.108.863 bin 1111111111111111111111111) di aver eseguito
tutte le combinazioni possibili

Michele
Alessandro Baraldi
2006-09-02 13:01:33 UTC
Permalink
Michele (Giò) ha scritto:

[CUT]
Post by Michele (Giò)
nel caso di N records, una soluzione potrebbe anche essere quella di
utilizzare una variabile long ogni 30 records (per esempio, 80 records, 3
variabili) ed utilizzare il singolo bit come marcatore per ogni record. Per
esempio, se abbiamo 25 records, e il contatore incrementale di uno è
11256 binario 10101111111000
Cioè il numero 11256 corrisponderà alla somma dei records che hanno il bit
postato a 1, cioè il n. 4,5,6,7,8,9,10,12 e 14
Così si è sicuri, una volta arrivati a 2^26-1 (che sarà l'ultimo valore per
l'incremento, 67.108.863 bin 1111111111111111111111111) di aver eseguito
tutte le combinazioni possibili
Michele
In questo caso non credo si possa parlare di Combinazioni(nel senso che
mi pare di aver intuito nella tua ipotesi) ma semplicemente di
tentativi di somma incrementale.

1° + 3° + 125° corrisponde a 125°+1°+3° e non è da fare

La somma in matematica gode della proprietà commutativa e di questo è
bene tenerne conto quando si sviluppano queste routine che per forza di
cose sono sempre una palla
al piede.... per lentezza e rischio Bugs..!

In questo caso a mio avviso la cosa semplice è proprio partire dal 1°
e man mano
scalare a +1 evitando inutilmente combinazioni già calcolate...,
quindi è inutile riprendere dal 1° Record(o indice se usiamo matrici)
quando questo è già stato oggetto di calcolo
su tutti gli indici seguenti.

@Alex
Michele (Giò)
2006-09-02 13:17:35 UTC
Permalink
"Alessandro Baraldi" <***@libero.it> ha scritto nel messaggio news:***@74g2000cwt.googlegroups.com...

Michele (Giò) ha scritto:

[CUT]
Post by Michele (Giò)
nel caso di N records, una soluzione potrebbe anche essere quella di
utilizzare una variabile long ogni 30 records (per esempio, 80 records, 3
variabili) ed utilizzare il singolo bit come marcatore per ogni record. Per
esempio, se abbiamo 25 records, e il contatore incrementale di uno è
[CUT]
In questo caso non credo si possa parlare di Combinazioni(nel senso che
mi pare di aver intuito nella tua ipotesi) ma semplicemente di
tentativi di somma incrementale.

@Alex

Si, forse combinazioni non è la parola esatta.

Il sistema di utilizzare il codice binario mette al riparo da fare somme
inutili (per la prop. comm.) in quanto ogni numero ha una e una sola
rappresentazione binaria.

Se poi nella tabella ci sono due o più valori uguali, questo è un altro paio
di maniche.

E' da intendere che ogni bit comunque rappresenta uno e un solo record (bit
1, primo record, bit 2, secondo record e via così) e data l'incrementalità
dell'intero lungo, è impossibile che si vengano a creare situazioni di somme
ripetute.

Se poi ho 5 valori identici (per esempio 100) nulla mi vieta di fare
100+....+100 per ottenere 500, ma questo succederà una e una sola volta nel
ciclo incrementale.
Sta poi a chi utilizza, la decisione o meno di ripetere i numeri, possono
sempre rappresentare 5 pezzi uguali nello scaffale.

cnt val
1 100
2 50
3 100
4 100
5 100
6 85
7 25
8 100

Sopra la somma dei 100 si otterrà con il binario10011101 in corrispondenza
del numero 157 del contatore e basta.
Michele (Giò)
2006-09-02 13:48:17 UTC
Permalink
"Alessandro Baraldi" <***@libero.it> ha scritto nel messaggio news:***@74g2000cwt.googlegroups.com...

Michele (Giò) ha scritto:

[CUT]
Post by Michele (Giò)
nel caso di N records, una soluzione potrebbe anche essere quella di
[CUT]
In questo caso non credo si possa parlare di Combinazioni(nel senso che
@Alex

Comunque ha ragione anche Alex a proposito della proprietà commutativa. Ho
male interpretato le sue parole. Aggiungo a quanto detto che dei 5 numeri
uguali nell'esempio, se nella tabella avessi anche un 400, si otterrebbero 5
risultati uguali, ovvero 400+100=500 per 5 volte, tante quente i 100. Al
lato teorico va anche bene, perchè ogni 100 è a se stante, ma al lato
pratico mi troverei centinaia di risultati inutili.

Bisogna lavorarci un pò su....................

Michele (Giò)
2006-09-02 13:03:08 UTC
Permalink
Scusate, troppa fretta

.........Così si è sicuri, una volta arrivati a 2^25-1 (che sarà l'ultimo
valore per
l'incremento, 33.554.431 bin 1111111111111111111111111) di aver eseguito
tutte le combinazioni possibili

Michele
Loading...