Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Star Wars Zero Company è l'erede di XCOM 2
Star Wars Zero Company è l'erede di XCOM 2
Bit Reactor porta nell’universo di Star Wars una struttura tattica che richiama apertamente XCOM 2, ma la arricchisce con legami tra i personaggi, progressione ruolistica, gestione della base e un sistema di combattimento costruito attorno a tre Punti Azione e alle risorse condivise della squadra
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia)
Abbiamo provato per una settimana intera la Can-Am Origin, la Dual Sport elettrica del gruppo canadese BRP: ecco com'è andata tra città, autostrada e un primo assaggio di sterrato
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco
Nelle ultime settimane abbiamo provato il mouse Logitech G305, la tastiera G316 X 98 e le cuffie G325. Si tratta del setup entry-level di Logitech che ormai, di "entry-level" ha ben poco. Tastiera e mouse offrono prestazioni di livello competitivo con quasi nessuna rinuncia e un livello di personalizzazione estremamente elevato. Le cuffie, invece, hanno mostrato qualche debolezza, ma propongono un ventaglio di funzionalità completo che consente di abbandonare completamente i cavi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-06-2009, 10:06   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
Questa query funziona bene, nel senso che mi restituisce i dati che mi aspetto.

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...
grazie mille

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 03-06-2009, 15:59   #2
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 03-06-2009, 17:59   #3
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
Ma ho aperti tanti di quei tab con ste query che non mi ci raccapezzo più
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 04-06-2009, 11:55   #4
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
uppettino....
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 19-06-2009, 11:11   #5
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
mi da la visualizzazione che desidero.

Per la tabella assicurazioni invece ho un bel problema:

Codice:
id_veicolo
startData
endData
durata
importo
se faccio la stessa query, giustamente ottengo l'importo soltanto in un mese.

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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2009, 20:19   #6
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2009, 23:23   #7
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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
E otterrai un record per ciascuna targa-mese, con l'importo mediato sui giorni del mese di riferiemento.
__________________
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 : 21-06-2009 alle 23:25.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2009, 23:38   #8
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
E mi funziona bene perchè per le manutenzioni non ho bisogno di dividere l'importo della manutenzione nei mesi, dato che è un importo o più importi relativi ad un mese solo o a più mesi.

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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2009, 23:41   #9
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
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
E mi funziona bene perchè per le manutenzioni non ho bisogno di dividere l'importo della manutenzione nei mesi, dato che è un importo o più importi relativi ad un mese solo o a più mesi.

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.
Sisi, ho scritto manutenzioni, ma voleva essere assicurazioni
__________________
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 21-06-2009, 23:44   #10
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Sisi, ho scritto manutenzioni, ma voleva essere assicurazioni
Ok

provo subito !!

grazie.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2009, 14:24   #11
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
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
Mi rendo conto di essere un idiota, ma non rieso a visualizzarla come per le altre

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 14:28.
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2009, 14:53   #12
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2009, 14:57   #13
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
Ma i numeri sono corretti?
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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2009, 15:10   #14
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
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
Inutile dire che stai evidentemente piegando l'SQL per avere in output un report.
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.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2009, 15:24   #15
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
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
Inutile dire che stai evidentemente piegando l'SQL per avere in output un report.
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.
Noooo!! manco a farlo apposta l'avevo appena trovata :

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
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Test ride Can-Am Origin: la moto elettrica che fa dimenticare il motore a scoppio (ma occhio all'autonomia) Test ride Can-Am Origin: la moto elettrica che f...
Logitech G325, G305 e G316 X: il tris per chi non vuole rinunciare a nulla, spendendo poco Logitech G325, G305 e G316 X: il tris per chi no...
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Google perde la testa: AI Overview conso...
Anthropic presenta Claude Sonnet 5.5, e ...
ESA e ClearSpace svilupperanno un satell...
Oracle, stock option da quasi un miliard...
Starship: si è conclusa anticipat...
Un computer quantistico ha funzionato ne...
Sovranità sui dati: AWS è ...
Il nuovo nome della distro Linux mobile ...
Due ventole da 220 mm e non solo: Cooler...
Truffa telefonica via Google Ads: il bro...
Google pensiona le Gems di Gemini: cosa ...
Flight 14: incertezza per un problema a ...
C'è un problema con i robot Tesla: i dip...
Raggi gamma anomali dalla Via Lattea sve...
NIO vende il 30% della divisione scambio...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:36.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v