2012-07-11 13 views
8

ho questi dati esempio:SQL Group By - record di conteggio al mese/anno, errore su inserto - non un MESE VALIDO

Country | Members | Joined 
USA  | 250  | 1/1/2012 
USA  | 100  | 1/8/2012 
Russia | 75  | 1/20/2012 
USA  | 150  | 2/10/2012 

Quando interrogo questi dati vorrei aggregare tutti i record in un dato un mese. Il risultato della query sarà simile:

Country | Members | Joined 
USA  | 350  | 1/2012 
Russia | 75  | 1/2012 
USA  | 150  | 2/2012 

Come di selezione che è abbastanza semplice:

select country, count(*) as members , to_char(trunc(joined), 'MM-YYYY') 
from table 
group by country, to_char(trunc(joined), 'MM-YYYY') 

Quella domanda mi darà i dati nel formato che voglio, ma il mio problema è che quando ho vai a inserirla in una nuova tabella pivot ricevo un errore perché il to_char() nell'istruzione select viene inserito in una colonna DATETIME (errore: ORA-01843 - non un mese valido)

Quando cambio il to_char() nella select to to_date(), non funziona ancora (stesso errore, ORA-01843 - non un mese valido):

select country, count(*) as members, to_date(trunc(joined), 'MM-YYYY') 
from table 
group by country, to_date(trunc(joined), 'MM-YYYY') 

Qualche suggerimento su come modificare questa query in modo tale che posso inserire il risultato in una nuova tabella la cui colonna "CAUSE" è di tipo DATETIME?

grazie in anticipo per eventuali suggerimenti/suggerimenti/commenti!

risposta

14

Si può fare qualcosa come to_date('01/'||trunc(joined), 'DD/MM/YYYY'), che lo trasformerebbe in una data valida prima. Hai solo bisogno di decidere se utilizzare il primo o l'ultimo giorno del mese (ultima è più complicato)

Un'altra opzione è quella di utilizzare la funzione di ripresa:

select country, count(*) as members, EXTRACT(MONTH FROM joined) as mn, EXTRACT(YEAR FROM JOINED) as yr,MIN(JOINED) as dt 
from table 
group by country, EXTRACT(MONTH FROM joined), EXTRACT(YEAR FROM JOINED) 

e poi da questo, si potrebbe basta selezionare la colonna dt e inserirla

+0

nella mia testa questo era esattamente quello che stavo cercando di capire. grazie mille! –

5

Si dovrebbe usare la funzione trunc per troncare la data al primo del mese. Ciò elimina la conversione della data in una stringa e la necessità di riconvertire la stringa in una data.

select country, 
     count(*) as members , 
     trunc(joined, 'MM') 
    from table 
group by country, 
      trunc(joined, 'MM') 
+0

buon suggerimento, guarderò in questo. apprezzo il tuo feedback –