120 votes

Comment grouper par mois à partir d'un champ de date en utilisant sql ?

Comment puis-je regrouper uniquement par mois à partir d'un champ de date (et non par jour) ?

Voici à quoi ressemble mon champ de date :

2012-05-01

Voici mon SQL actuel :

select  Closing_Date, Category,  COUNT(Status)TotalCount from  MyTable
where Closing_Date >= '2012-02-01' and Closing_Date <= '2012-12-31'
and Defect_Status1 is not null
group by  Closing_Date, Category

145voto

GarethD Points 30173

Je l'utiliserais :

SELECT  Closing_Date = DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), 
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, Closing_Date), 0), Category;

Ce groupe sera constitué le premier de chaque mois, alors

`DATEADD(MONTH, DATEDIFF(MONTH, 0, '20130128'), 0)` 

donnera '20130101' . Je préfère généralement cette méthode, car elle permet de conserver les dates en tant que dates.

Vous pouvez également utiliser quelque chose comme ceci :

SELECT  Closing_Year = DATEPART(YEAR, Closing_Date),
        Closing_Month = DATEPART(MONTH, Closing_Date),
        Category,  
        COUNT(Status) TotalCount 
FROM    MyTable
WHERE   Closing_Date >= '2012-02-01' 
AND     Closing_Date <= '2012-12-31'
AND     Defect_Status1 IS NOT NULL
GROUP BY DATEPART(YEAR, Closing_Date), DATEPART(MONTH, Closing_Date), Category;

Cela dépend vraiment du résultat que vous souhaitez obtenir. (L'année de clôture n'est pas nécessaire dans votre exemple, mais si la plage de dates traverse une limite d'année, elle peut l'être).

49voto

Bogdan Gavril Points 4059

Utilisez le DATEPART pour extraire le mois de la date.

Vous feriez donc quelque chose comme ça :

SELECT DATEPART(month, Closing_Date) AS Closing_Month, COUNT(Status) AS TotalCount
FROM t
GROUP BY DATEPART(month, Closing_Date)

23voto

Andrei Sura Points 41

J'ai utilisé le FORMAT pour y parvenir :

select
 FORMAT(Closing_Date, 'yyyy_MM') AS Closing_Month
 , count(*) cc 
FROM
 MyTable
WHERE
 Defect_Status1 IS NOT NULL
 AND Closing_Date >= '2011-12-01'
 AND Closing_Date < '2016-07-01' 
GROUP BY FORMAT(Closing_Date, 'yyyy_MM')
ORDER BY Closing_Month

15voto

Aniket Warey Points 196

En ajoutant MONTH(date_column) en GROUP BY .

SELECT Closing_Date, Category,  COUNT(Status)TotalCount
FROM   MyTable
WHERE  Closing_Date >= '2012-02-01' AND Closing_Date <= '2012-12-31'
AND    Defect_Status1 IS NOT NULL
GROUP BY MONTH(Closing_Date), Category

2voto

John Sonnino Points 117

Try this:

select min(closing_date), date_part('month',closing_date) || '-' || date_part('year',closing_date) AS month,
Category, COUNT(Status)TotalCount 
FROM MyTable
where Closing_Date >= '2012-02-01' AND Closing_Date <= '2012-12-31'
AND Defect_Status1 is not null
GROUP BY month, Category,
ORDER BY 1

De cette façon, vous regroupez par un format de date concaténé, joint par un -.

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