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):
Quando invece vorrei ottenere:
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