Gruppieren nach Monat aus dem Feld Datum mit SQL

87

Wie kann ich aus einem Datumsfeld nur nach Monat gruppieren (und nicht nach Tag gruppieren)?

So sieht mein Datumsfeld aus:

2012-05-01

Hier ist mein aktuelles SQL:

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
user1858332
quelle

Antworten:

111

Ich würde dies verwenden:

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;

Dies wird also bis zum ersten eines jeden Monats gruppiert

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

wird geben '20130101'. Im Allgemeinen bevorzuge ich diese Methode, da sie Daten als Daten enthält.

Alternativ können Sie Folgendes verwenden:

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;

Es hängt wirklich davon ab, was Ihre gewünschte Ausgabe ist. (Das Abschlussjahr ist in Ihrem Beispiel nicht erforderlich, aber wenn der Datumsbereich eine Jahresgrenze überschreitet, kann dies der Fall sein.)

GarethD
quelle
GarethD, danke Mann, beide Methoden haben gut funktioniert. Gibt es eine Möglichkeit, das Jahr und den Monat in einem Feld zusammenzufassen? Dies bedeutet, dass das Format wie folgt angezeigt wird: 12. Dezember (Dezember ist der Monat und 12 ist das Jahr). danke
user1858332
Die erste Methode erledigt dies, Sie müssen nur die Spalte formatieren. Ich würde empfehlen, dies außerhalb von SQL zu tun, aber wenn es als solches getan werden muss, können Sie so etwas wieSELECT STUFF(SUBSTRING(CONVERT(VARCHAR, CURRENT_TIMESTAMP, 6), 4, 6), 4, 1, '-');
GarethD
@GarethD Könnten Sie erklären, wie Sie Datumsangabe zwischen 0 und Datum verwendet haben? 0 ist kein Datum.
Irfandar
1
und was macht Closing_Date = DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0), warum nicht einfach DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0)
irfandar
3
@irfandar 0 ist kein Datum, aber SQL-Server konvertiert es implizit in den 1. Januar 1900. Bei Ihrer zweiten Frage Closing_Date =handelt es sich nur um den Spaltenalias, es ist dasselbe wie AS Closing_Datenach dem Ausdruck. Es ist völlig subjektiv, aber ich persönlich finde die alias =Notation viel einfacher zu lesen als AS Alias. Um mehr darüber zu erfahren, warum ich es bevorzuge, lesen Sie diesen Artikel von Aaron Bertrand.
GarethD
42

Verwenden Sie die DATEPART- Funktion, um den Monat aus dem Datum zu extrahieren.

Sie würden also so etwas tun:

SELECT DATEPART(month, Closing_Date) AS Closing_Month, COUNT(Status) AS TotalCount
FROM t
GROUP BY DATEPART(month, Closing_Date)
Bogdan Gavril MSFT
quelle
16
Für MySQL können Sie MONTH () oder MONTHNAME () anstelle von DATEPART
frazras
Wenn Sie diese Abfrage häufig ausführen, sollten Sie einen geeigneten Index erstellen.
user_0
Plus 1 für eine einfache Antwort.
berdem
9
Dies würde Monate aus verschiedenen Jahren als gleich betrachten - was normalerweise NICHT erwartet wird.
ivan_pozdeev
Dies setzt eine "1" für Januar usw. Es sagt Ihnen nicht den Monatsnamen
user890332
15

Ich habe die FORMAT- Funktion verwendet, um dies zu erreichen:

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
Andrei Sura
quelle
9

Durch die Zugabe von MONTH(date_column)in 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
Aniket Warey
quelle
1

Die DATEPART-Funktion funktioniert unter MySQL 5.6 nicht. Verwenden Sie stattdessen MONTH ('2018-01-01').

Jordanien
quelle
1

Versuche dies:

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

Auf diese Weise gruppieren Sie nach einem verketteten Datumsformat, verbunden mit einem -

John Sonnino
quelle
0
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;
Nida
quelle
0

SQL Server 2012 Version oben,

SELECT  format(Closing_Date,'yyyy-MM') as ClosingMonth,
        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 format(Closing_Date,'yyyy-MM'), Category;
YHTAN
quelle
-1

Sie können dies tun, indem Sie Year (), Month () Day () und datepart () verwenden.

In Ihrem Beispiel wäre dies:

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 Year(Closing_Date), Month(Closing_Date), Category
user1845584
quelle
Dies ist nicht gültig SQL
Mad Echet
Nun, das ist gültig, bringt aber unvorhersehbare Ergebnisse, da Sie nicht nach den von Ihnen ausgewählten Feldern gruppieren. Sie können einen beliebigen Wert für das Abschlussdatum haben, solange Datum und Jahr identisch sind.
Mad Echet
-1

Versuchen Sie den folgenden Code

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;
Antony Raj
quelle