Newsgroup: it.comp.software.database
Titolo: Query: non ho idea di come farla :)

Salve a tutti,
   ho una tabella Commesse che ha, tra gli altri campi, un campo di inizio
comessa e un campo di fine commessa.
Per confrontare la pianificazione con l'effettiva esecuzione avrei bisogno
di fare una query che mi restituisse, per ogni mese di "vita" della
commessa, mese anno e progressivo mese.
Es. se una commessa (id:commessa = 1, ad esempio) nasce a novembre 2004 e
muore a febbraio 2005 (per comodità i mesi li considero interi) avrei
bisogno di ottenere questi risultati:
id    ! mese    ! anno    ! progr
-------------------------------
1      11            2004    1
1      12            2004    2
1       1             2005    3
1        2            2005    4
Spero di essere stato chiaro :)
Avete idea su come farla? il database e' mysql e con le funzioni di
manipolazione date non ho molta dimestichezza, preferendo in genere fare
tutto a livello applicativo. Ma stavolta sto "discutendo amabilmente" con
jasperreports, quindi c'e' poco da fare: deve essere sql grezzo :-)
Grazie in anticipo!
   Francesco
-- 
---
Francesco Galli / Cinghiale Mannaro
Personal: 
http://cinghialemannaro.splinder.com
TMS project: 
http://tms.inera.it

 TMS project: 
http://tms.inera.it
-----------------------------------------
Messaggio inviato con Excite Newsgroup.
http://www.excite.it/newsgroup

> quale versione di mysql ?
C:\Documents and Settings\fgalli>\mysql\bin\mysql --version
\mysql\bin\mysql  Ver 12.22 Distrib 4.0.18, for Win95/Win98 (i32)
mysql admin mi dice 4.0.18-NT :-)
Grazie dell'interesse
   Francesco

 
Scusa ma dal risultato di esempio che vorresti ottenere deduco che la 
commessa muore sia a gennaio che a frebbraio 2005?!?!
Eta

 commessa muore sia a gennaio che a frebbraio 2005?!?!
   No, assolutamente. Mi serve una riga per ogni mese che la commessa resta
"in vita", mese di nascita e mese di morte compresi. Quindi se nasce a
novembre 2004 e muore a febbraio 2005, devo listare anche febbraio 2005.
Grazie dell'interessamento, attendo con ansia una zampa :)
   Francesco


Quello che non e' chiaro e' la quantita' dei record di base.
Se tu hai, da quanto ho capito, *un* (1) record per la commessa
che inizia a novembre e finisce a febbraio, come puoi aspettarti di
ottenere 4 record in uscita?
Per ottenere questo risultato dovresti avere anche una tabella con
qualche record con riferimenti temporali, da associare alla tabella
delle commesse.
Cosi' come l'hai raccontata, con un solo record in una sola tabella,
non puoi ottenere una serie temporale di record con SQL semplice.
Ciao
gmax
-- 
   ____ ____  _____ _   _
  / _  |    \(____ ( \ / )
( (_| | | | / ___ |) X (
  \___ |_|_|_\_____(_/ \_)
(_____|
MySQL Certified Professional
Sapere, saper fare, fare, far sapere
http://gmax.oltrelinux.com

ti fai una tabella anni e una tabella mesi
poi fai un bel prodotto cartesiano tra tutte e tre, e filltri solo
quelle con mese anno interne al range
non e' difficile...
select m.mese, a.anno, 
c.id
, c.progr
from mesi m, anni a, commesse c
where (year(c.inizio)>a.anno or (year(c.inizio)=a.anno and
month(c.inizio)>=m.mese) and (...)
(non mi ricordo se year e  month sono funzioni di mysql, guarda nel
manuale eventualmente per la traduzione qualcosa c'e' sicuro)

Questo risolve un buon 50% del problema. Grazie! :-) due tabelle d'appoggio
non hanno mai fatto male a nessuno :)
Per l'altra parte del problema... come fare? io avrei bisogno del
progressivo del mese di vita. In altre parole devo sapere, dato l'esempio,
che gennaio 2005 e' il TERZO mese di vita della commessa. Su Oracle avrei
rownum, ma su mysql non ne ho idea. Tu ne hai? :)
Grazie mille!


 non puoi ottenere una serie temporale di record con SQL semplice.
    Neanche con qualche join un po' arzigogolata con se' stessa?
Grazie mille del tuo contributo!



Mi sembra di fare un interrogatorio, cercando di farti ammettere
l'esistenza di dati occulti. :)
Dunque, dovrebbe esserci una tabella utenti, in relazione con commesse
e una tabella scarichi in relazione con utenti
Quindi farei qualcosa del egenere:
(mi invento un po' di campi visto che le tue tabelle sono segrete)
SET @progressivo = 0;
SELECT commesse.id_commessa, scarichi.anno, scarichi.mese, sum(giorni), @progressivo := @progressivo + 1
FROM
       scarichi
       inner join utenti on (scarichi.id_utente = utenti.id_utente)
       inner join commesse on (utenti.id_commessa=commesse.id_commessa)
GROUP BY
      id_commessa, scarichi.anno, scarichi.mese
Se non hai una relazione fra commesse e utenti, mi sa che la struttura dati e' sbagliata.
Se vuoi qualcosa di piu' preciso, devi dare piu' informazioni. Quindi fai cosi':
DESCRIBE scarichi;
DESCRIBE utenti; (se ce l'hai)
DESCRIBE commesse;
SELECT * from commesse where id_commessa =1 \G
SELECT * from utenti  where id_commessa = 1;
select scarichi.*
from scarichi
inner join utenti using (id_utente) where id_commessa = 1 ; # se esiste questa relazione
Pubblica il risultato di queste query, e vedrai che il problema
diventa piu' facile da risolvere.


 Se vuoi qualcosa di piu' preciso, devi dare piu' informazioni. Quindi fai
cosi':
Spero di averti fornito tutte le indicazioni... non c'e' nulla di segreto :)
Grazie tanto!



Questa ti dovrebbe bastare per partire:
SET @progressivo = 0;
SELECT
     commission.id_commission,
     discharge.year,
     discharge.month,
     sum(discharged_days),
     @progressivo := @progressivo + 1 AS progressivo
FROM
     commission
     inner join discharge USING (id_commission)
GROUP BY
     commission.id_commission, discharge.year, discharge.month
Ovviamente, se non hai avuto scarichi in un determinato mese, ti resta un buco.


 Ovviamente, se non hai avuto scarichi in un determinato mese, ti resta un
buco.
  Sarebbe risolvibile secondo te con una join con EffortPlanning? si puo'
utilizzare il campo "progressivo"?
Ciao e grazie mille!!! :)
   Francesco

    Francesco
Prego.


Ho risolto in modo "altenrativo", visto che jasperreports non accetta
queries di piu' di uno statement.
Che ne pensi?
SELECT distinct
commission.id_commission,
discharge.year,
discharge.month,
abs(year(commission.creation_date)*12+month(commission.creation_date) -
(discharge.year * 12) - discharge.month) +1 as progressivo
FROM
     commission
     inner join discharge USING (id_commission)
where commission.id_commission = 1
GROUP BY
     commission.id_commission, discharge.year, discharge.month
