Newsgroup: it.comp.appl.access
Titolo: calcolare % su Query

Ho una query  del tipo:
Data                nome                    valore
12/12/2001        A                            2
13/12/2001        A                            3
14/12/2001        A                            1
12/12/2001        B                            5
13/12/2001        B                            25
14/12/2004        B                            20
Vorredi se possibile una query2  che mi restituisca:
Data                nome                    valore            %
12/12/2001        A                            2
13/12/2001        A                            3                % +50
14/12/2001        A                            1                % - 66,6
12/12/2001        B                            5
13/12/2001        B                            25              %+50
14/12/2004        B                            20              %-20
Cioč la variazione percentuale tra il valore del record "1" rispetto al 
record "2"  e via di seguito.
Grazie 

 record "2"  e via di seguito.
SELECT a.Data, a.nome, a.valore,
  ([Valore]*100/(SELECT Max(b.valore) FROM Tabella AS b
  WHERE b.nome = a.nome And b.Data < a.Data))-100 AS DiffPer
FROM Tabella AS a
Nella proprietà Formato del campo calcolato usa:
+#;-#
-- 
HTH
Karl
*********
Access FAQ: 
www.donkarl.com/it
 

 FROM Tabella AS a
Hmm, no, dev'essere p.e.
SELECT a.Data, a.Nome, a.Valore,
Valore * 100/
  (SELECT Valore FROM query1
   WHERE Nome = a.Nome And Data =
      (SELECT Max(Data) FROM query1
      WHERE Nome = a.Nome And Data < a.Data))
-100 AS DiffPer
FROM query1 AS a


ho riscontrato moltissimi valori non giusti,
Non so dove sto sbagliando, tu gentilmente puoi fare una verifica?
Grazie 

 > +#;-#
io farei così
----
SELECT a.Data, a.nome, a.valore,
  ([Valore]*100/(SELECT TOP 1 b.valore FROM Tabella AS b
  WHERE b.nome = a.nome And b.Data < a.Data
  ORDER BY Data DESC))-100 AS DiffPer
FROM Tabella AS a
----
Data+Nome deve essere univoco altrimenti ci vuole un ID.
:-)
-- 
Giorgio Rancati
[Office Access MVP]

 FROM Tabella AS a
 potrebbe gentilmente commentarmi sinteticamente le singole istruzioni SQL ?
grazie 

 > io farei così

Ciao Ettore,
la query è formata da una Select principale e da una SubQuery, diamo alla
SubQuery il nome X e riscriviamo la Select principale
Select Principale
----
SELECT a.Data, a.nome, a.valore,
  ([Valore]*100/X)-100 AS DiffPer
FROM Tabella AS a
----
qui c'è poco da commentare, è una comune query di selezione in cui si esegue
un calcolo, l'unica cosa da notare è l'assegnazione dell'alias "a" alla
tabella.
adesso vediamo come la Subquery ricava il valore X
----
SELECT TOP 1 b.valore
FROM Tabella AS b
WHERE b.nome = a.nome And b.Data < a.Data
ORDER BY Data DESC
-----
"SELECT TOP 1 b.valore "
restituisce il valore del campo "b.valore" della prima riga filtrata dalla
condizione nella Where e ordinata dalla clausola order by.
"FROM Tabella AS b"
indica da quale tabella prelevare il valore assegnando alla tabella l'alias
b.
"WHERE b.nome = a.nome And b.Data < a.Data"
Viene applicato il filtro e vengono restituite le righe il cui campo b.Nome
è uguale al campo a.Nome e la cui b.data è inferiore alla a.data
ti ricordo che b è la tabella della subquery e a è la tabella della query
principale.
"ORDER BY Data DESC"
le righe vengono ordinate in ordine decrescente in modo che venga resa solo
quella con la data più alta dalla TOP 1.
Come funziona:
La subquery viene eseguita per ogni riga della Select principale che scorre
le seguenti righe:
----
12/12/2001        A                            2
13/12/2001        A                            3
14/12/2001        A                            1
12/12/2001        B                            5
13/12/2001        B                            25
14/12/2004        B                            20
----
Quando la select principale elabora la :
1^ riga, la subquery cercerà le righe che hanno il Nome="A" e la
Data<12/12/2001
   non viene trovato niente quindi il risultato è NULL
  X=NULL
2^ riga, la subquery cercerà le righe che hanno il Nome="A" e la
Data<13/12/2001
  Viene troata una sola riga, quella del 12/12/2001 quindi il risultato è 2
  X=2
3^ riga, la subquery cercerà le righe che hanno il Nome="A" e la
Data<14/12/2001
  Vengono trovate due righe (queste)
12/12/2001        A                            2
13/12/2001        A                            3
Vengono ordinate in ordine decrescente di data
13/12/2001        A                            3
12/12/2001        A                            2
Poi la TOP 1 rende solo la prima riga
13/12/2001        A                            3
 Quindi il risultato è 3
  X=3
e così via per tutte le altre righe.
Ciao
