Evitare duplicati in una query di raggruppamento

di il
1 risposte

Evitare duplicati in una query di raggruppamento

Ciao a tutti.

Ho un problema con una query di raggruppamento.

Devo gestire delle carte rifornimento carburante facendone la contabilità mensile.

Ho completato tutto il calcolo contabile, ma nella stesura della documentazione richiesta sto avendo un problema su un riepilogo (il problema dell’oggetto).

Lavoro (per il problema in questione) su 2 tabelle: tblCedole e tblCedoleDett (in relazione uno-a-molti)

tblCedole: registro i dati generali delle carte rifornimento (progressivo, valore (50€), prezzo di acquisto carburante (cioè €/lt), etc)

tblCedoleDett: ogni volta che viene usata una tessera, registro qui i dati dell’uso (data, prezzo alla pompa, prezzo di acquisto carburante (quello della tabella precedente, lo riporto anche qui per comodità durante la contabilità), etc etc)

Ovviamente, quando si comprano le tessere, ad ogni tessera corrisponderà una quantità “amministrativa” di carburante (viene comprato ad un tot a litro), che al momento del rifornimento del mezzo (quindi quantità “reale”) può essere inferiore (nel caso il prezzo alla pompa sia maggiore) o superiore (se il prezzo alla pompa sia inferiore)

Su uno dei documenti contabili, ho bisogno di riepilogare le tessere utilizzate in base alla quantità “amministrativa”.

Il problema dell’uso delle tessere è che:

-          La tessera viene usata per intero

-          La tessera viene usata parzialmente, in 2 o più volte.

-          Può capitare di usare tessere comprate in tempi diversi (quindi €/lt “amministrativo” diversi)

Di conseguenza, nella tabella tblCedoleDett mi posso ritrovare (riduco l’esempio ai soli campi che mi interessano ora):

DATA

IDCarburante

IDCedola

SPESA

PrezzoAcquisto

1

1

1

50

1.710

3

1

2

30

1.710

4

1

2

20

1.710

6

1

3

20

1.820

7

1

3

20

1.820

NOTA: PrezzoAcquisto mi riferisco al prezzo/litro al momento di acquisto della tessera, non al prezzo alla pompa.

NOTA2: per IDCarburante uso 1 per Benzina e 2 per Gasolio

La query che sto provando è:

SELECT [IDCarburante], [PrezzoAcquisto], SUM(Spesa) as TotSpesa, Count([IDCedola]) AS TotaleCedole
FROM tblCedoleDett
WHERE [IDCarburante]= 1 AND DatePart('yyyy',[DataUso])=2025 And DatePart('m',[DataUso])=10
GROUP BY [IDCarburante],[PrezzoAcquisto]
ORDER BY [PrezzoAcquisto]

Nel caso dell’esempio di sopra:

1)      A parità di PrezzoAcquisto (quindi se PrezzoAcquisto fosse lo stesso per tutti i record), mi ritroverei che il campo TotaleCedole varrebbe 5

2)      Nel caso della tabella (cioè PrezzoAcquisto diversi), mi ritroverei con 2 TotaleCedole: 3 e 2

Cioè ottengo (nel caso della tabella di sopra - caso 2):

1

1.710

100

3

1

1.820

40

2

 Quando invece vorrei ottenere:

1

1.710

100

2

1

1.820

40

1

Notare che l’ultima tessera non è stata usata per il suo importo totale (motivo per il quale ho bisogno di quel campo SUM)

All’atto pratico, quello che devo riportare è qualcosa del genere:

-          mese di Ottobre: nr. X tessere da € 50 al prezzo di € 1.710 per Y litri e importo totale Z

   nr. X tessere da € 50 al prezzo di € 1.820 per Y litri e importo totale Z

 In definitiva quello che vorrei ottenere è un raggruppamento ma senza conteggiare i duplicati

Spero di essere stato chiaro nel descrivere la cosa.

Grazie

Andrea

1 Risposte

  • Re: Evitare duplicati in una query di raggruppamento

    Devi creare una query (a) che somma i totali spese e raggruppa per tessere oltre a filtrare per date

    Una query (b) che ricava il count della query (a)

    SELECT //query(a)
     IDCarburante,
     PrezzoAcquisto,
     IDCedola,
     SUM(Spesa) AS TotSpesaCedola
    FROM 
     tblCedoleDett
    WHERE 
     IDCarburante = 1
     AND DatePart('yyyy', DataUso) = 2025
     AND DatePart('m', DataUso) = 10
    GROUP BY 
     IDCarburante, 
     PrezzoAcquisto, 
     IDCedola;
    SELECT //(query b)
     A.IDCarburante,
     A.PrezzoAcquisto,
     SUM(A.TotSpesaCedola) AS TotSpesa,
     COUNT(*) AS TotaleCedole
    FROM 
         (query a) As A
    WHERE 
       A.TotSpesaCedola > 0 
    GROUP BY 
       A.IDCarburante, A.PrezzoAcquisto
    ORDER BY A.PrezzoAcquisto;
Devi accedere o registrarti per scrivere nel forum
1 risposte