Newsgroup: it.comp.appl.access
Titolo: Query %cumulativa

Salve,
tabella clienti
IDCliente
Cliente
...
Tabella Offerte
IDOfferta
IDCliente
Importo
....
per ogni cliente dovrei calcolare:
importo complessivo
% incidenza sul complessivo
% cumulativa (...č questo il problema!)
Esempio:
importo complessivo offerte accettate: 100
per cui per ogni cliente avrei:
Tizio 50   60%    60%
Caio 20   30%    90%
Sem  10  10%     100%
come faccio ad ottenere la percentuale cumulativa nella query?
praticamente devo sommare la percentuale precedente alla corrente...
Come formulare la query per usare con il report?
ho sbattuto un pň ma niente.
Grazie


è logico che c'è un errore...
Tizio  60    60%    60%
Caio  30    30%    90
Sem  10    10%    100%
Chiedo scusa..

 ha scritto nel messaggio
news:h%YTa.201905$Ny5.5...@twister2.libero.it...

Ciao samR
Query di esempio con %
--------------------------------------------------------
Select
   IdCliente,
   Cliente,
   TotImporto,
   (SELECT SUM(Importo)
     FROM Offerte AS B
    WHERE B.IdCliente<=A.IdCliente) AS Progressivo,
   (SELECT SUM(Importo)
    FROM Offerte) AS TotOfferte,
   TotImporto/TotOfferte*100 AS Perc,
   Progressivo/TotOfferte*100 AS PercProgressivo
FROM [
              SELECT
                  TOP 100 PERCENT
                  Clienti.IDCliente,
                  Clienti.Cliente,
                  Sum(Offerte.Importo) AS TotImporto
             FROM
                  Clienti INNER JOIN Offerte
                  ON Clienti.IdCliente = Offerte.IDCliente
                 GROUP BY Clienti.Cliente, Clienti.IdCliente
                 ORDER BY Clienti.IdCliente
            ]. AS A
-------------------------------------------------------------
Naturalmente se devi usarla in un report si può ottimizzare in questo modo
--------------------------------------------------------------
Select
   IdCliente,
   Cliente,
   TotImporto,
   (SELECT SUM(Importo)
     FROM Offerte AS B
    WHERE B.IdCliente<=A.IdCliente) AS Progressivo
FROM [
              SELECT
                  TOP 100 PERCENT
                  Clienti.IDCliente,
                  Clienti.Cliente,
                  Sum(Offerte.Importo) AS TotImporto
             FROM
                  Clienti INNER JOIN Offerte
                  ON Clienti.IdCliente = Offerte.IDCliente
                 GROUP BY Clienti.Cliente, Clienti.IdCliente
                 ORDER BY Clienti.IdCliente
            ]. AS A
------------------------------------------------------------
E fare i calcoli delle percentuali nei controlli del report.
Ciao e Buona notte
Giorgio

     WHERE B.IdCliente<=A.IdCliente) AS Progressivo
potresti spiegarmi questo ?
IDCliente <= ?  cio?
Ancora un pň di pazienza su.. :)
Grazie ancora!


Ciao Samr
Non sono Mandrake e se ti abitui a scrivere le query senza l'interfaccia
grafica di access ti vengono in modo naturale.
Per calcolare i progressivi in una query si utilizza una SubQuery che nel
mio esempio è
(SELECT SUM(Importo)
      FROM Offerte AS B
     WHERE B.IdCliente<=A.IdCliente) AS Progressivo
Vediamo come funziona
1 ) SELECT SUM(Importo)
Somma il campo importo (e qui non c'è niente si strano)
2) FROM Offerte AS B
Dalla tabella offerte a cui do l'alias B per non confonderla con il rowset
principale A generato dalla query inclusa tra le parentesi quadre FROM
[...Query principale...] AS A
3) WHERE B.IdCliente<=A.IdCliente
Dove l'IdCliente della tabella offerte è minore o uguale all'Id cliente
della query principale.
Quindi per il cliente 1 sommerà tutti le offerte che hanno Idcliente>=1, per
il cliente2 sommerà le offerte del cliente1+ le offerte del cliente 2 e così
via riga per riga della query principale.
Per far funzionare il gioco è necessario on campo univoco e ordinato come
appunto l'Idcliente.
Se ordiniamo i clienti per l'importo delle offerte possiamo trovare uno o
più clienti con lo stesso importo quindi la query non funziona più e bisogna
utilizzare altre tecniche, ad esempio creare una tabella temporanea con
campo contatore in cui andiamo ad accodare le righe ordinate per importo, ma
la cosa si complica.
Comunque rileggendo il tuo post originale vedo che devi utilizzare il tutto
in un report.
In un report tutto è più facile perchè puoi calcolare al momento i
progressivi e le percentuali
Esempio.
ORIGINE RECORD DEL REPORT
----------------------------
SELECT
   TOP 100 PERCENT
   Clienti.IDCliente,
   Clienti.Cliente,
   Sum(Offerte.Importo) AS TotImporto
   Count(1) AS TotOfferte
   Sum(IIF(Offerte.Confermata=True,1,0)) AS TotOfferteConfermate
FROM
   Clienti INNER JOIN Offerte
   ON Clienti.IdCliente = Offerte.IDCliente
   GROUP BY Clienti.Cliente, Clienti.IdCliente
----------------------------
Nella finestrella Ordinamento e raggruppamento inserisci TotImporto
ordinamento decrescente
Nella sezione Corpo inserisci i Controlli
1) T_Cliente , Origine controllo campo Cliente
2) T_TotImporto , Origine controllo  campo TotImporto
3) T_PercCli, Origine controllo=[T_TotImporto]/[GT_TotImporto]*100
(percentuale del cliente)
4) T_PercProg, Origine controllo=[T_ProgImporto]/[GT_TotImporto]*100
(percentuale progressiva)
5) GT_TotImporto , Origine controllo =Somma(TotImporto), visibile=no
6) T_ProgImporto ,  Origine controllo campo TotImporto , visibile=no, Somma
Parziale=Su Gruppo
Con la stessa impostazione puoi calcolare l'incidenza sul numero di offerte,
ovviamente devi differenziare il conteggio se un'offerta è stata confermata
o no, come puoi vedere dalla query mi sono inventato il campo Confermata.
Ciao Giorgio.