|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[SQL]Ottenere intervalli mensili
Ciao a tutti
Scusate per il titolo poco chiaro ma stamattina mi sento leggermente rincitrullito... allora, ho questa query: Codice:
SELECT (a.Importo / a.Durata) as importoMese, b.RagioneSociale, b.targa FROM assicurazioni a JOIN VeicoliNoleggiati B ON a.id_Veicolo = b.id_Veicolo Considerando che la tabella assicurazioni ha anche due campi di tipo 'Date', che sono: startData endData e che si riferiscono al periodo di copertura dell'assicurazione, vorrei capire se fosse possibile adeguare la query di sopra in modo che l'espressione: importo / durata mi venga riportata per mese, per esempio: Codice:
GENNAIO-----FEBBRAIO 190,00______190,00 etc... RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
mmm... se anche la trovassi non andrebbe bene..
Il mio problema è quindi più complicato Avendo questa situazione: Azienda->AssicuraVeicolo->Data = 03/06/2009 Durata polizza mesi = 12 importo = 1.000,00 Azienda->NoleggiaVeicolo->Data = 22/07/2009 supponendo che il termine del noleggio coincida con la data di scadenza dell'assicurazione: importo per l'assicurazione = (importo / totaleGiorniNoleggio) -> 1000 / 316 = 3,16 Fin qui.. tutto ok (diciamo) ora, come faccio tramite sql a fare in modo che la somma di questi giorni mi venga imputata al mese di riferimento? Cioè, considerando la data di inizio noleggio dell'esempio, dal 22/07 al 31/07 sono 9 giorni, quindi in 'LUGLIO' dovrei ottenere 3,16 * 9 = 28,44 e alla scadenza dovrei ottenere: 'GENNAIO' (2010) 3,16 * 3 = 9,48
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
sono giunto a questo:
Codice:
select a.targa, sum(case month (a.inizioNoleggio) when '1' then (b.importo / datediff(last_day(a.inizioNoleggio), a.inizioNoleggio)) else 0 end )as 'GENNAIO', sum(case month (a.inizioNoleggio) when '2' then (b.importo / datediff(last_day(a.inizioNoleggio), a.inizioNoleggio)) else 0 end )as 'FEBBRAIO', sum(case month (a.inizioNoleggio) when '3' then (b.importo / datediff(last_day(a.inizioNoleggio), a.inizioNoleggio)) else 0 end )as 'MARZO', sum(case month (a.inizioNoleggio) when '4' then (b.importo / datediff(last_day(a.inizioNoleggio), a.inizioNoleggio)) else 0 end )as 'APRILE' from veicolinoleggiati a join assicurazione b on a.id = b.id_veicolo where a.inizioNoleggio between b.startData and b.endData group by a.targa
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
uppettino....
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
sono ancora in alto mare ma qualche progresso l'ho fatto.
Considerando due tabelle: Manutenzioni, Assicurazioni la tabella manutenzioni: Codice:
id_veicolo tipoManutenzione dataManutenzione importo descrizione //ottengo il risultato desiderato in questo modo: SELECT targa, SUM(IF(MONTH(dataManutenzione) = 1), importo, 0)) As 'GENNAIO', SUM(IF(MONTH(dataManutenzione) = 2), importo, 0)) As 'FEBBRAIO', //fino a dicembre SUM(importo) as 'TOTALE' FROM manutenzioni JOIN autoveicoli ON manutenzioni.id_veicolo = autoveicoli.id GROUP BY targa Per la tabella assicurazioni invece ho un bel problema: Codice:
id_veicolo startData endData durata importo E' come se dovessi ciclare all'interno della query ma non ho idea di come fare. Plz.... ![]() grazie mille. RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Costruisciti la classica dimensione temporale
Ovvero una tabella con PK pari alla data, e con varie colonne relative agli attributi della dimensione temporale. Che deve essere prepopolata. ES: PK_Data Data (oppure varchar con descrittivo YYYY-MM-DD) DescGiorno varchar(10) DescMese varchar(6) DescMeseLungo varchar(20) DescAnno varchar(4) DescSettimana varchar(6) '2009-06-21', '2009-06-21', '2009-06','2009 Giugno', '2009', '2009-28' (il 28 della 28esima settimana e' sparato a caso, occorre costruire bene e popolare) Fatta bene una volta, fatta per sempre (o quasi) Dopodiche', se durata vale esattamente il numero di giorni tra startData ed EndData, farai una cosa simile a Codice:
SELECT targa, DescMese, Sum(Importo/durata) ValPerMese FROM manutenzioni JOIN autoveicoli ON manutenzioni.id_veicolo = autoveicoli.id JOIN DimTempo ON PK_Data BETWEEN startData AND EndData GROUP BY targa, DescMese
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 22-06-2009 alle 00:25. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Ciao gugoXX e grazie per aver risposto
Il problema sulla tabella delle manutenzioni l'ho risolto con la query: Codice:
SELECT targa, SUM(IF(MONTH(dataManutenzione) = 1), importo, 0)) As 'GENNAIO', SUM(IF(MONTH(dataManutenzione) = 2), importo, 0)) As 'FEBBRAIO', //fino a dicembre SUM(importo) as 'TOTALE' FROM manutenzioni JOIN autoveicoli ON manutenzioni.id_veicolo = autoveicoli.id GROUP BY targa Infatti la visualizzazione che ottengo è questa: [img=http://img221.imageshack.us/img221/1329/immaginexfn.th.jpg] Il problema lo ho per le assicurazioni, perchè devo dividere l'importo per la durata della polizza e visualizzarlo così come lo visualizzo per le manutenzioni. grazie mille RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
provo subito !! grazie.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Ho provato e riprovato quasi tutta la notte
quello che ottengo è: Codice:
1, 'April', 169.000000 1, 'August', 169.000000 1, 'December', 160.666667 1, 'February', 169.000000 1, 'January', 8.333333 1, 'July', 169.000000 1, 'June', 169.000000 1, 'March', 169.000000 1, 'May', 169.000000 1, 'November', 169.000000 1, 'October', 169.000000 1, 'September', 169.000000 PS: il numero si riferisce all'id, dalla query ho omesso la targa
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
Ultima modifica di RaouL_BennetH : 22-06-2009 alle 15:28. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ma i numeri sono corretti?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Si, sono corretti. Questo veicolo come altri, ha due polizze distinte. La divisione dell'importo totale nei mesi è corretta.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Bene.
Allora devi solo fare la trasposta. Codice:
SELECT id_veicolo,SUM(CASE WHEN Mese=1 THEN valore ELSE 0 END) Gennaio,
,SUM(CASE WHEN Mese=2 THEN valore ELSE 0 END) Febbraio,
...
,SUM(CASE WHEN Mese=12 THEN valore ELSE 0 END) Dicembre
FROM (La query di prima)
GROUP BY id_veicolo
L'SQL dovrebbe essere usato per estrarre i dati, che dovrebbero essere nel formato che avevi prima, senza le trasposizioni (che peraltro hai gia' fatto anche tu nella prima parte della soluzione) Il tool per la reportistica dovrebbe essere in grado di fare queste operazioni da solo, dati in ingresso i dati puri, mediante funzionalita' di pivoting o altro. Questo "piegare l'SQL" ti costera' in seguito tanti mal di testa.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
Codice:
select targa, sum(case month(date_hour) when '1' then (importo / durata) else 0 end )as 'GENNAIO', sum(case month(date_hour) when '2' then (importo / durata) else 0 end )as 'FEBBRAIO', sum(case month(date_hour) when '3' then (importo / durata) else 0 end )as 'MARZO', sum(case month(date_hour) when '4' then (importo / durata) else 0 end )as 'APRILE', sum(case month(date_hour) when '5' then (importo / durata) else 0 end )as 'MAGGIO', sum(case month(date_hour) when '6' then (importo / durata) else 0 end )as 'GIUGNO', sum(case month(date_hour) when '7' then (importo / durata) else 0 end )as 'LUGLIO', sum(case month(date_hour) when '8' then (importo / durata) else 0 end )as 'AGOSTO', sum(case month(date_hour) when '9' then (importo / durata) else 0 end )as 'SETTEMBRE', sum(case month(date_hour) when '10' then (importo / durata) else 0 end )as 'OTTOBRE', sum(case month(date_hour) when '11' then (importo / durata) else 0 end )as 'NOVEMBRE', sum(case month(date_hour) when '12' then (importo / durata) else 0 end )as 'DICEMBRE', sum(distinct(importo)) as TOTALE from assicurazione join autoveicolo on assicurazione.id_veicolo = autoveicolo.id join calendar on date_hour between startData and endData group by targa Per quanto riguarda il discorso 'report' : E' proprio quello che devo fare. Queste 'viste' saranno lanciate direttamente dal query browser per poi essere esportate o su csv o altri formati o per essere stampate direttamente. Aggiungo: nella realtà aziendale in cui mi trovo stai sicuro che se devono trovare quattrini per fare il leasing di una bmw ci riescono.. ma se si tratta di comprare strumenti software o pagare un professionista .... lasciamo perdere va.. io mi devo arrangiare come posso gugoXX ancora una volta non so come ringraziarti ...sta diventando imbarazzante
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:12.




















