SQLを使用して日付フィールドから月でグループ化する方法


87

日付フィールドから月のみでグループ化するにはどうすればよいですか(日ごとにグループ化することはできません)。

これが私の日付フィールドがどのように見えるかです:

2012-05-01

これが私の現在の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

回答:


112

私はこれを使用します:

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;

これは毎月1日にグループ化されるので、

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

与えるでしょう'20130101'。日付を日付として保持するので、私は一般的にこの方法を好みます。

または、次のようなものを使用できます。

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;

それは本当にあなたの望む出力が何であるかに依存します。(この例では、年を閉じる必要はありませんが、日付範囲が年の境界を超える場合は必要になる可能性があります)。


GarethD、ありがとう、どちらの方法もうまくいきました。年と月の両方を1つのフィールドにグループ化する方法はありますか?この形式のように表示する意味:12月12日(12月は月、12は年)。ありがとう
user1858332 2013年

最初の方法はこれを行います。列をフォーマットする必要があります。SQLの外部でこれを行うことをお勧めしますが、そのように行う必要がある場合は、次のようなものを使用できますSELECT STUFF(SUBSTRING(CONVERT(VARCHAR, CURRENT_TIMESTAMP, 6), 4, 6), 4, 1, '-');
GarethD 2013年

@ GarethD0とdateの間でdatediffをどのように使用したか説明してください。0は日付ではありません。
irfandar 2013年

1
また、Closing_Date = DATEADD(MONTH、DATEDIFF(MONTH、0、Closing_Date)、0)は、DATEADD(MONTH、DATEDIFF(MONTH、0、Closing_Date)、0)
irfandar 2013年

3
@irfandar 0は日付ではありませんが、SQL-Serverは暗黙的に1900年1月1日に変換します。2番目の質問Closing_Date =は列のエイリアスでありAS Closing_Date、式の後にあるのと同じです。それは完全に主観的ですが、私は個人的にalias =表記がより読みやすいと思いますAS Alias。私がそれを好む理由の詳細については、AaronBertrandによるこの記事を読んでください
GarethD 2013年

42

DATEPART関数を使用して、日付から月を抽出します。

したがって、次のようなことを行います。

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

16
Mysqlの場合、DATEPARTの代わりにMONTH()またはMONTHNAME()を使用できます
frazras 2014

このクエリを頻繁に実行する場合は、適切なインデックスを作成することを検討してください。
user_0 2014

プラス1で簡単に返信できます。
berdem 2016

10
これは、異なる年の月を同じと見なします。これは通常、予期されていませんでした。
ivan_pozdeev 2018

これにより、1月などに「1」が付けられます。月の名前は
わかり

15

私はこれを達成するためにFORMAT関数を使用しました:

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

9

を追加MONTH(date_column)する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

1

DATEPART関数はMySQL5.6では機能しません。代わりにMONTH( '2018-01-01')を使用してください。


1

これを試して:

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

このようにして、連結された日付形式でグループ化し、-で結合します。


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;

0

上記のSQLServer 2012バージョン、

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;

-1

これは、Year()、Month()、Day()、およびdatepart()を使用して実行できます。

あなたの例では、これは次のようになります。

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

これは有効なSQLではありません
Mad Echet 2013年

これは有効ですが、選択したフィールドでグループ化しないため、予測できない結果が生じます。日付と年が同じである限り、終了日に任意の値を設定できます。
Mad Echet 2013年

-1

次のコードを試してください

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.