103 votes

Regroupement SQL par mois et année

Je ne suis pas sûr de ce que je dois écrire dans la requête SQL suivante pour afficher la colonne 'date' comme ceci : "mois-année" - "9-2011".

SELECT MONTH(date) + '.' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY MONTH(date), YEAR(date)

Ce que je veux faire, c'est modifier les données de la première colonne pour afficher le mois et l'année au lieu du mois seul.

0 votes

Cette question est quelque peu confuse - essayez-vous de TRIER par date ?

0 votes

Je ne comprends pas ceci : "Je voudrais montrer la première colonne car je veux formater différemment la première colonne pour qu'elle soit unique".

0 votes

@JNK - Microsoft SQL @Chris - Non, je n'essaie pas de trier par date, je veux juste changer les résultats de la première colonne pour afficher le mois et l'année au lieu de n'afficher que le mois.

194voto

Lamak Points 33901
SELECT CAST(MONTH(date) AS VARCHAR(2)) + '-' + CAST(YEAR(date) AS VARCHAR(4)) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY CAST(MONTH(date) AS VARCHAR(2)) + '-' + CAST(YEAR(date) AS VARCHAR(4))

Ou comme @40-Love l'a mentionné, vous pouvez faire des castings avec des zéros en tête :

GROUP BY 
  CAST(YEAR(date) AS VARCHAR(4)) + '-' + right('00' + CAST(MONTH(date) AS VARCHAR(2)), 2)

1 votes

C'est inutile pour le tri par date avec cette méthode

24voto

Dumitrescu Bogdan Points 3264

Je suppose qu'il s'agit de MS SQL, car cela ressemble à la syntaxe MS SQL.

Vous devriez mettre la même chose dans le group by comme vous l'avez fait dans le select .

Par exemple :

Select MONTH(date)+'-'+YEAR(date), ....
...
...
...
group by MONTH(date)+'-'+YEAR(date)

5 votes

MONTH(date) renvoie un int . Il faudra un peu de cast -

0 votes

True devrait être converti en varchar, mais ce que je voulais dire, c'est que l'on peut mettre n'importe quoi dans la partie select tant que la même chose se trouve dans la partie group. Théoriquement, l'instruction select est valide du point de vue du SQL.

0 votes

Non en MS SQL cela ne retournera pas une chaîne, mais ce que j'ai écrit était pour la démonstration du point de vue du regroupement.

20voto

YHTAN Points 112

SQL Server 2012 supérieur, je préfère utiliser la fonction format(), plus simple.

SELECT format(date,'MM.yyyy') AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY format(date,'MM.yyyy')

2 votes

J'ai dû utiliser DATE_FORMAT(date, '%m.%Y')

9voto

MelOS Points 1
Yet another alternative: 

Select FORMAT(date,'MM.yy')
...
...
group by FORMAT(date,'MM.yy')

0 votes

Est-ce la même chose que répondu par YHTAN le 8 avril 19 à 2:14 ?

7voto

eupton Points 211

Si je comprends bien. Afin de regrouper vos résultats comme demandé, votre clause Group By doit avoir la même expression que votre instruction select.

GROUP BY MONTH(date) + '.' + YEAR(date)

Pour afficher la date au format "mois-date", remplacez le '.' par '-'. La syntaxe complète serait quelque chose comme ceci.

SELECT MONTH(date) + '-' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS
SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY MONTH(date) + '.' + YEAR(date)

3 votes

Je suppose que vous n'avez jamais essayé d'exécuter ce code parce qu'il ne peut pas fonctionner ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X