Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Creazione Array da tabella MySQL senza OUTER JOIN

Problemi di HTML? Di PHP, ASP, .NET, JSP, Perl, SQL, JavaScript, Visual Basic..?
Vuoi realizzare programmi in C, C++, Java, Ruby o Smalltalk, e non sai da che parte cominciare?
Entra qui e troverai le risposte!

Moderatori: Triumph Of Steel, archimede

Creazione Array da tabella MySQL senza OUTER JOIN

Postdi Dylan666 » 17/05/16 15:59

Buongiorno a tutti, ho una tabella di un DB MySQL più o meno così fatta:

Codice: Seleziona tutto
DATA             TIPO
2015-1         Topolino
2015-1         Paperino
2015-1         Pluto
2015-2         Paperino
2015-3         Topolino
2015-4         Topolino
2015-4         Paperino
2015-4         Paperino
2015-4         Topolino
2015-5         Topolino
2015-5         Pippo
2015-5         Pippo
2015-5         Topolino
2015-5         Topolino
2015-6         Pluto


Mi servirebbe trasformare quei dati in questo formato:
  • mettendo sia Paperino che Topolino su una unica riga per ogni mese in cui compare Paperino o Topolino
  • contandone le ricorrenze per ogni mese popolato
  • ignorando tutti gli altri tipi di record (es. Pluto e Pippo)

Codice: Seleziona tutto
DATA             TIPO-A      TOT-A      TIPO-B      TOT-B
2015-1         Topolino        1         Paperino      1
2015-2         -               0         Paperino      1
2015-3         Topolino        1         -             0
2015-4         Topolino        2         Paperino      2
2015-5         Topolino        3         -             0


Volevo provare facendo una join della tabella su se stessa, ma il FULL OUTER JOIN in MySQL non esiste e usando UNION mi sono un po' perso...

Grazie a chi vorrà aiutarmi
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Sponsor
 

Postdi archimede » 17/05/16 17:23

Scritta al volo senza provare:
Codice: Seleziona tutto
SELECT DISTINCT t.data, 'Topolino' AS tipoA,
       (SELECT COUNT(*) FROM tabella WHERE tipo='Topolino' and data=t.data) AS totA,
       'Paperino' AS tipoB,
       (SELECT COUNT(*) FROM tabella WHERE tipo='Paperino' and data=t.data) AS totB
  FROM tabella AS t
 ORDER BY t.data;
HTH.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi Dylan666 » 17/05/16 17:35

Prima di tutto grazie :)
La parte che io ho chiamato "DATA" corrisponde in realtà a questo:

concat(EXTRACT(YEAR from t.date_completed),'-',EXTRACT(MONTH from t.date_completed)) as data


Come lo integro col tuo codice?

Grazie
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi Dylan666 » 17/05/16 18:05

Intanto ti confermo che il tuo codice funziona perfettamente, grazie!
Come ti dicevo prima però vorrei escludere il giorno dal parametro della data, in modo da avere le rilevazioni accorpate per mese e anno.

Anzi se hai suggerimenti megliori dell'EXTRACT per togliere il giorno sono ben accetti!

Grazie della grande disponibilità
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi archimede » 18/05/16 08:13

Codice: Seleziona tutto
SELECT DISTINCT month(t.date_completed) AS Mese, year(t.date_completed) AS Anno,
       'Topolino' AS tipoA,
       (SELECT count(*)
          FROM tabella
         WHERE tipo                  = 'Topolino'
           AND month(date_completed) = month(t.date_completed)
           AND year(date_completed)  = year(t.date_completed)) AS totA,
       'Paperino' AS tipoB,
       (SELECT count(*)
          FROM tabella
         WHERE tipo                  = 'Paperino'
           AND month(date_completed) = month(t.date_completed)
           AND year(date_completed)  = year(t.date_completed)) AS totB
  FROM tabella AS t
 ORDER BY year(t.date_completed), month(t.date_completed);
Ci possono essere altri modi, ma questo dovrebbe essere sufficientemente veloce.

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi archimede » 19/05/16 07:57

Un'alternativa potrebbe essere:

1.Query_Raggruppa
Codice: Seleziona tutto
SELECT year(t.date_completed) AS Anno, month(t.date_completed) AS Mese, tipo, count(*) AS tot
  FROM tabella
 GROUP BY year(t.date_completed), month(t.date_completed), tipo;

2.
Codice: Seleziona tutto
SELECT t.Anno, t.Mese, 'Topolino' AS tipoA,
       (SELECT SUM(Tot)
          FROM Query_Raggruppa
         WHERE tipo = 'Topolino'
           AND Mese = t.Mese
           AND Anno = t.Anno) AS totA, 'Paperino' AS tipoB,
       (SELECT SUM(Tot)
          FROM Query_Raggruppa
         WHERE tipo = 'Paperino'
           AND Mese = t.Mese
           AND Anno = t.Anno) AS totB
  FROM Query_Raggruppa AS t
 ORDER BY t.Anno, t.Mese;
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi Dylan666 » 19/05/16 11:00

Ho provato con la prima (quell del 18/05/2016) e funziona benissimo! Grazie!
Avrei un'altra domanda, questa volta per MS SQL.

Ho una tabella fatta così:
Codice: Seleziona tutto
FRUTTA      VERDURA
Mela         Carota
Banana       Zucchina
Arancia      Pomodoro
Pera         Cetriolo


Avrei bisogono che la colonna VERDURA fosse un record avanti rispetto a quella FRUTTA.
Quindi il primo record di FRUTTA deve essere affiancato dal secondo di VERDURA
Poi il secondo record di FRUTTA deve essere affiancato dal terzo di VERDURA e così via:

Codice: Seleziona tutto
FRUTTA      VERDURA
Mela         Zucchina
Banana       Pomodoro
Arancia      Cetriolo
Pera           -


Anche in questo caso grazie dell'aiuto e del tempo dedicatomi
Avatar utente
Dylan666
Moderatore
 
Post: 38040
Iscritto il: 18/11/03 16:46

Postdi archimede » 19/05/16 12:15

La vedo dura, soprattutto se hai solo quei due campi.

Come minimo ci vuole un campo per ordinarli (altrimenti come determini quale record è primo, secondo, ecc.) ma anche così in puro SQL non saprei.

Ma il requisito reale qual è? Perché detta così non ha molto senso...

Alessandro
archimede
Moderatore
 
Post: 2755
Iscritto il: 07/11/02 12:41
Località: Genova


Torna a Programmazione


Topic correlati a "Creazione Array da tabella MySQL senza OUTER JOIN":


Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti