Newsgroup: it.comp.lang.delphi
Titolo: [semiOT] Query SQL

Ho bisogno di selezionare il valore minore per ogni riga di una
tabella.
Ho le tabelle organizzate per mese, con ogni campo denominato dal
nome del mese abbreviato e dal numero che va da 1 all'ultimo del mese
tabella Gennaio
ID__gen1__gen2__gen3__gen4  ...
1____3_____4_____3_____5            deve ritornare 3
2____4_____4_____4_____3            deve ritornare 3
3____5_____3_____2_____5            deve ritornare 2
Questa č una parte dell'algoritmo che ho implementato:
DaysCount:= DaysBetween(StartDate, EndDate);
SetLength(colName, DaysCount);    // array dinamico di stringhe
curDay:= StartDate;
days:= '';
for i:= 0 to DaysCount-1 do
 begin
   colName[i]:= MonthName[MonthOf(curDay)] + IntToStr(DayOf(curDay));
   days:= days + ',' + colName[i];
   IncDay(curDay);
 end;
// CUT
//if MonthOf(StartDate) <> MonthOf(EndDate) then
//codice sql per fare il join tra tabelle di mesi diversi
// CUT
ADOQuery1.SQL.Clear;
ADOQuery1.Open;
ADOQuery1.SQL.Add('SELECT ID'+days+' FROM ' + sqlTable);
while not DBQuery.EOF do
  begin
    lowest:= 99999;
    for i:= 0 to DaysCount-1 do
     begin
       c:= ADOQuery1.FieldByName(colName[i]).AsInteger;
       if c < lowest then lowest:= c;
     end;
ShowMessage('ID ' + ADOQuery1.FieldByName('ID').AsString + ':  minore
= ' + IntToStr(lowest));
    ADOQuery1.Next;
  end;
ADOQuery1.Close;
L'algoritmo tuttavia non č cosě efficiente...
Sapete consigliarmi un modo per far restituire direttamente da MS
Access il minore tra una serie di campi stabiliti a runtime, qualcosa
tipo la funzione sql MIN(colonna) ma che funzioni sulle righe e non
sulle colonne.
Ho pensato a una stored procedure ma non so nemmeno da dove
iniziare...
Qualsiasi suggerimento č benvenuto.
Grazie,
Antonio

 iniziare...
Dico la mia: o ti accontenti delle prestazioni dell'algoritmo che hai
implementato o ristrutturi il database.
Le stored procedure alle quali fai riferimento sono un'ottima cosa:
infatti, sql non si limita alle select/insert/update/delete ma prevede
tutta una serie di istruzioni per ciclare sui dati estratti e manipolarli.
Il problema č che queste sono utilizzabili solitamente nei database
client/server, tipo MsSQLServer, Oracle, Interbase o Firebird, mentre tu
vuoi usare Access, che č un db desktop. Tirate le somme, in Access puoi
creare delle viste (Query) ma non delle stored procedure.
Quindi: o ti accontenti delle performance o ristrutturi il database in
maniera diversa:
	VALGIORNI (anno, mese, giorno, valore)
"verticalizzando" quindi la memorizzazione dei dati. La formattazione in
output all'utente dei dati in orizzontale non deve essere necessariamente
un vincolo: puoi sempre usare una stringgrid dopo aver ciclato sui record
risultato. Aggiungo anche che se devi confrontare i dati di due mesi
diversi, con l'altro sistema penso che triboleresti un po'''
Ho detto la mia.
Saluti
	Marco Bortolani
	info @ 
marcobortolani.it

 Ho detto la mia.
E ti ringrazio ;-)
Antonio

Ok, mi sono convinto verticalizzo le tabelle, anche se come stavano
adesso mi velocizzavano altre interrogazioni.
Organizzo le tabelle in anni.
tabella2004:
ID    IDpersona     Data     Valore
Per ogni persona avrò 364 righe in +, ma 11 tabelle in meno.
Grazie ancora Marco :-)
Antonio

 E ti ringrazio ;-)
Se non ci si aiuta tra di noi...
		Marco