Joomla.it Forum
Non solo Joomla... => Database => : federcla 18 Sep 2013, 15:22:29
-
Ciao a tutti,
non riesco a fare una cosa e mi servirebbe una mano.
Ho una tabella con 3 colonne, anno, mese, importo, dove inserisco ogni mese l'importo di una lavorazione. Ora ho la necessita di impagginare i risultati in questo modo
mese 2010 2011 2012 2013
gennaio 500 100 300 200
febbraio 100 200 300 100
ecc ecc
devo però farlo con una query perchè la devo inserire in un modulo che sto usando che mi permette di usare solo linguaggio SQL.
Mi potete aiutare?
grazie
-
Nessuno sa aiutarmi :(
-
sto ancora cercando (forse anche altri che hanno letto il post) di capire se devi formattare (quindi questione legata all'aspetto) o devi prendere il risultato di una query e visualizzarlo in una pagina (quindi un problema di paginazione).
-
Sono riuscito a creare più confusione ve? ;D
devo fare una query che impagini il risultato come ti ho descritto nel post precedente.
Sto utilizzando Plotalot così da avere dei grafici dell'andamento per anno, il grafico sono riuscito a farlo ma ora devo inserire nella pagina una tabella con i valori del grafico, messi in questo modo
mese 2010 2011 2012 2013
gennaio 500 100 300 200
febbraio 100 200 300 100
ecc ecc
il problema è che nella tabella i valori li ho in questo modo
gennaio 2010 500
febbraio 2010 100
gennaio 2011 100
febbraio 2011 200
ecc ecc
Se fosse possibile inserire codice php la fare io a mano l'impaginazione, ma non credo che Plotalot mi permetta di farlo, così mi serve una query che mi resituisca i dati in questo modo
Solo che non so dove sbattere la testa
Spero di essere riuscito a spiegarmi meglio
-
Spero di essere riuscito a spiegarmi meglio
no, ma ti avevo fatto una domanda, dovevi rispondere solo opzione 1 opzione2.
va bene ci sarà qualcuno che meglio di me capirà ;)
-
Non so come spiegarti meglio :)
Grazie per il tentativo cmq :)
-
Con questa query sono riuscito in parte a fare quello che mi serve
SELECT DISTINCT(mese), (SELECT importo FROM sks_app_fat WHERE mese = 1 AND anno = 2012) AS '2012', (SELECT importo FROM sks_app_fat WHERE mese = 1 AND anno = 2013) AS '2013' FROM sks_app_fat WHERE mese = 1
mi restituisce questo risultato
mese 2012 2013
1 1000 1500
Ora dovrei riuscire a farlo per tutti e 12 i mesi, ho inserito WHERE mese between 1 and 12
però mi restituisce sempre gli stessi valori per 12 volte
credo che sia necessaria una stored procedure con un ciclo, ma non sono molto pratico sull'argomento, mi potete aiutare?
-
Se metti mese > 1
-
Se metto > 1 nell'ultimo WHERE mi da lo stesso problema, solo che parte da 2
se metto > 1 nelle select tra parentisi mi torna questo errore:
Subquery returns more than 1 row
é per questo che avevo pensato ad una Stored procedures, così da poter usare un ciclo
-
devi fare un ciclo foreach.
-
In sql?
-
Quello che ho provato a fare ora è questo
CREATE PROCEDURE JCAI ()
BEGIN
DECLARE var INT;
SET var = 1;
WHILE var <= 12 DO
SELECT DISTINCT(mese), (SELECT importo FROM sks_app_fat WHERE mese = var AND anno = 2012) AS '2012', (SELECT importo FROM sks_app_fat WHERE mese = var AND anno = 2013) AS '2013' FROM sks_app_fat WHERE mese = var;
SET var = var + 1;
END WHILE;
END; //
mi ha restituito questo errore
CREATE PROCEDURE JCAI( ) BEGIN DECLARE var INT;
Messaggio di MySQL: (http://localhost/phpmyadmin/themes/dot.gif) (http://localhost/phpmyadmin/url.php?url=http%3A%2F%2Fdev.mysql.com%2Fdoc%2Frefman%2F5.5%2Fen%2Ferror-messages-server.html&token=0bd8ede667f5a87fdd7f15b5f8ca9237)
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
-
usa le join e se non basta le union
-
Scusa ma non ti seguo, i dati sono tutti nella stessa tabella come faccio a usare le join?
ho provato con la UNION ma va in errore
SELECT distinct(mese), (importo) as '2012'
FROM sks_app_fat WHERE anno = 2012
UNION
SELECT (importo) as '2013'
FROM sks_app_fat WHERE anno = 2013
questo è l'errore:
#1222 - The used SELECT statements have a different number of columns
-
CI SONO RIUSCITO!!!!!!!!!!!!
Bisogna farlo con le JOIN ;D ;D ;D ;D ;D
Ora stacco, lunedì metto la soluzione e inserisco risolto
GRAZIE MILLE A TUTTI, IN PARTICOLARE A M_W_C
-
Come promesso inserisco la query che mi da il risultato che stavo cercando :)
Select a.mese AS Mese, (FORMAT(a.importo,2)) as '2012', (FORMAT(b.importo,2)) as '2013' from sks_app_fat as a, sks_app_fat as b WHERE a.anno = 2012 AND b.anno = 2013 and a.mese = b.mese and a.tipo = 'y_class' and a.tipo = b.tipo
Questa mi restituisce la pagina come serve a me :)
In pratica richiamo 2 volte la stessa tabella rinominandola una volta 'a' e una volta 'b', poi un po' di confronti con i valori uguali e il gioco è fatto :)
-
Ora però ho un altro problema, mi è stato chiesto di fare anche la somma delle colonne e di prelevare la media per ogni colonna.
Così ho modificato la query in questo modo:
Select a.n_mese AS 'N Mese', a.mese AS 'Mese', (FORMAT(a.importo,2)) as '2012', (FORMAT(b.importo,2)) as '2013' from sks_app_fat as a, sks_app_fat as b WHERE a.anno = 2012 AND b.anno = 2013 and a.mese = b.mese and a.tipo = 'y_class' and a.tipo = b.tipo
UNION
Select ' ', ' ', ' ', ' ' from sks_app_fat
UNION
Select ' ','TOT', FORMAT(SUM(a.importo),2), FORMAT(SUM(b.importo),2) from sks_app_fat as a, sks_app_fat as b WHERE a.anno = 2012 AND b.anno = 2013 and a.mese = b.mese and a.tipo = 'y_class' and a.tipo = b.tipo
UNION
Select ' ', ' ', ' ', ' ' from sks_app_fat
UNION
Select ' ','MEDIA MESE', FORMAT(AVG(a.importo),2), FORMAT(AVG(b.importo),2) from sks_app_fat as a, sks_app_fat as b WHERE a.anno = 2012 AND b.anno = 2013 and a.mese = b.mese and a.tipo = 'y_class' and a.tipo = b.tipo
Il problema è che mi salta l'ordinamento, sto cerccando di usare la ORDER BY a.n_mese ASC, ma non funziona
mi potreste dare una mano a superare anche questo scoglio?
Grazie
PS. queste righe (Select ' ', ' ', ' ', ' ' from sks_app_fat) le ho inserite per fare una riga vuota nella tabella
-
Risoloto anche il problema con l'ORDER BY ;D
Questa è la query modificata:
(Select a.mese AS 'Mese', (FORMAT(a.importo,2)) as '2012', (FORMAT(b.importo,2)) as '2013' from sks_app_fat as a, sks_app_fat as b WHERE a.anno = 2012 AND b.anno = 2013 and a.mese = b.mese and a.tipo = 'y_class' and a.tipo = b.tipo ORDER BY a.n_mese LIMIT 12)
UNION
(Select ' ', ' ', ' ' from sks_app_fat)
UNION
(Select 'TOT', FORMAT(SUM(a.importo),2), FORMAT(SUM(b.importo),2) from sks_app_fat as a, sks_app_fat as b WHERE a.anno = 2012 AND b.anno = 2013 and a.mese = b.mese and a.tipo = 'y_class' and a.tipo = b.tipo)
UNION
(Select 'MEDIA MESE', FORMAT(AVG(a.importo),2), FORMAT(AVG(b.importo),2) from sks_app_fat as a, sks_app_fat as b WHERE a.anno = 2012 AND b.anno = 2013 and a.mese = b.mese and a.tipo = 'y_class' and a.tipo = b.tipo)
In pratica ho racchiuso le query tra parentesi ed ho aggiunto alla prima l'ORDER BY "campo di interesse" LIMIT "limite"
Serve usare entrambe le condizioni per far si che la query restituisca l'ordinamento corretto quando si usa la UNION ;)
Qui trovate la guida alle UNION di MySQL
http://dev.mysql.com/doc/refman/5.0/en/union.html (http://dev.mysql.com/doc/refman/5.0/en/union.html)