web-dev-qa-db-fra.com

SQL Group By - comptage des enregistrements par mois / année, erreur lors de l'insertion - PAS UN MOIS VALIDE

J'ai cet exemple de données:

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

Lorsque j'interroge ces données, je souhaite agréger tous les enregistrements d'un mois donné. Le résultat de la requête ressemblerait à ceci:

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

En tant que sélection assez simple:

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

Cette requête me donnera des données au format que je souhaite, mais mon problème est que lorsque je vais l'insérer dans un nouveau tableau croisé dynamique, j'obtiens une erreur car le to_char () dans l'instruction select est placé dans une colonne DATETIME (erreur : ORA-01843 - pas un mois valide)

Quand je change le to_char () dans le select en to_date (), cela ne fonctionne toujours pas (même erreur, ORA-01843 - pas un mois valide):

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

Des suggestions sur la façon de modifier cette requête de manière à ce que je puisse insérer le résultat dans une nouvelle table dont la colonne "JOINED" est de type DATETIME?

merci d'avance pour tous conseils/suggestions/commentaires!

11
Pat Grady

Vous pouvez faire quelque chose comme to_date('01/'||trunc(joined), 'DD/MM/YYYY'), qui le transformerait d'abord en une date valide. Vous devez simplement décider d'utiliser le premier ou le dernier jour du mois (le dernier est plus compliqué)

Une autre option consiste à utiliser la fonction EXTRACT:

 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)

puis à partir de là, vous pouvez simplement sélectionner la colonne dt et l'insérer

17
jle

Vous devriez utiliser la fonction trunc pour tronquer la date au premier du mois. Cela élimine la conversion de la date en chaîne et la nécessité de reconvertir la chaîne en date.

select country, 
       count(*) as members , 
       trunc(joined, 'MM')
  from table
 group by country,
          trunc(joined, 'MM')
9
Justin Cave