Newsgroup: it.comp.lang.delphi
Titolo: [semi-OT] Domanda su Query

Ho due tabelle che hanno la stessa identica struttura contenenti (per
ogni record) dei dati su prodotti. La prima contiene i prodotti nuovi,
la seconda i vecchi. Vi è poi un campo sul quale è specificata la marca
del prodotto. La mia necessità è quella di fare una query che mi
estrapoli le marche più utilizzate. Al momento faccio un calcolo che è
approssimativo:
Query.SQL.Text := 'select marca, count(*) as n from old_prod group by
marca order by n desc limit 10';
while not Query.Eof do begin
  Query2.SQL.Text := select count(*) from new_prod where marca = "' +
Query.Fields[0].AsString + '"';
  ...
  Query.Next;
end; 
Così facendo prendo le prime 10 marche della old_prod (dove in teoria vi
sono più record) e in base a queste vado a sommarci gli eventuali record
della new_prod.
Capite bene che però non è un calcolo corretto poichè se nella new_prod
vi sono presenti un sacco di record di una marca "x" non presente nella
old_prod e di cui la somma supera le prime 10 marche calcolate nella
old_prod, la marca "x" non mi viene visualizzata.
Qualcuno ha qualche suggerimento per poter migliorare il mio calcolo?
Il massimo sarebbe fare una joni tra le due tabelle ed eseguire quindi
il calcolo su entrambe ma non credo si possa fare.
Un saluto, 
Dario
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 il calcolo su entrambe ma non credo si possa fare.
Prova a guardare la parola chiave UNION, che permette appunto di avere come
risultato l'insieme di due o più select concatenate (che ovviamente devono
restituire lo stesso numero e tipo di campi). 
Quindi la limit e la order by verrebbero eseguite dopo l'unione delle due
select
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
L’esperienza è un modo per dare un nome agli errori (Oscar Wilde)

 select
Il comando UNION (tra l'altro molto utile, non lo conoscevo) si avvicina
molto al mio obiettivo ma non lo centra. Dopo aver eseguito la query ho
comunque 2 record per ogni prodotto
marca | n
----------
ACER  | 10  // dalla new_prod
ACER  | 5   // dalla old_prod
IBM   | 12   
IBM   | 4   
...
Io vorrei UN solo record per marca... magari non si puς fare, io ci 
speravo :(


 wrote in message
news:76a7f2a7566bf4ee37f...@mygate.mailgate.org
Utilizzando il comando suggerito sono arrivato a questa conclusione. 
Si può ulteriormente ottimizzarla?
Grazie mille, 
Dario
procedure xxx;
var i: integer;
begin
  for i:=0 to High(TopProdotti) do begin // Reset
    TopProdotti[i].Marca := '';
    TopProdotti[i].Qty := 0;
  end;
  // Crea una tabella temporanea
  Query.SQL.Text := 'create table if not exists temp_marca';
  Query.SQL.Add('(select marca, count(*) as N from new_prod where 1=1 '
+ StringaSQLContrattoSelezionato + ' group by marca)');
  Query.SQL.Add('UNION (select marca, count(*) as n from old_prod where
1=1 ' + StringaSQLContrattoSelezionato + ' group by marca)');
  Query.ExecSQL;
  Query.SQL.Text := 'select marca, sum(N) as TOT from temp_marca group
by marca order by TOT desc, marca limit 15';
  Query.Active := True;
  i:=0;
  while not Query.Eof do begin
    TopProdotti[i].Marca := Query.Fields[0].AsString;
    TopProdotti[i].Qty := Query.Fields[1].AsInteger;
    Inc(i);
    Query.Next;
  end;
  Query.Active := False;
  Query.SQL.Text := 'drop table if exists temp_prodotti';   // eliminala
  Query.ExecSQL;
end;


 speravo :(
Ci ho pensato un attimo ma non mi viene in mente altro, mi spiace. Se poi
riesci a fare tutto con una query, fammi sapere ;-)
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
Non permettete alla lingua di oltrepassare il pensiero (A.Checov)

Non dici che DB utilizzi, e questo complica le cose perchè
quello che sto per dirti si può fare su DB server 
(Oracle e Firebird sono sicuro, e anche altri che supportino
l'SQL ANSI 92). Paradox e altri DB file-based non lo so.
Comunque, se con
select marca, n from new_prod 
union 
select marca, n from old_prod
ottieni
marca | n
----------
ACER  | 10  // dalla new_prod
ACER  | 5   // dalla old_prod
IBM   | 12   
IBM   | 4   
...
puoi fare anche
select marca, sum(n) 
from (
select marca, n from new_prod 
union 
select marca, n from old_prod
) group by marca
che ti ritornerà 
marca | n
----------
ACER  | 15
IBM   | 16   
Ciao
Giuseppe Garzotto
--- posted by geoForum on 
http://www.delphiedintorni.it

 ) group by marca
Porca vacca, ero sicuro che si potesse fare ma non mi ricordavo come...si
vede che sono 3 anni che non tocc un db :-/
-- 
Lis        
www.alessandroghezzi.it
O'Telma:   
http://snipurl.com/otelma
Due cose sono infinite: l'universo e la stupiditą umana. Sull'universo ho
ancora i miei dubbi (Albert Einstein)