web-dev-qa-db-fra.com

Comment regrouper par mois à partir du champ Date à l'aide de SQL

Comment puis-je grouper uniquement par mois à partir d'un champ de date (et non par groupe 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
61
user1858332

Je voudrais utiliser ceci:

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;

Cela regroupera par le premier de chaque mois, donc 

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

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

Sinon, vous pouvez 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 de votre sortie souhaitée. (L'année de clôture n'est pas nécessaire dans votre exemple, mais il se peut que la plage de dates dépasse une année).

74
GarethD

Utilisez la fonction DATEPART pour extraire le mois de la date. 

Donc, vous feriez quelque chose comme ça: 

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

J'ai utilisé la fonction FORMAT pour accomplir ceci:

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
5
Andrei Sura

En ajoutant MONTH(date_column) dans 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
3
Aniket Warey
SELECT  to_char(Closing_Date,'MM'), 
        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 Category;
0
Nida

La fonction DATEPART ne fonctionne pas sur MySQL 5.6, utilisez plutôt MONTH ('2018-01-01')

0
Jordan