SQL을 사용하여 날짜 필드에서 월별로 그룹화하는 방법


84

날짜 필드에서 월별로만 그룹화하고 일별로 그룹화하지 않으려면 어떻게해야합니까?

내 날짜 필드는 다음과 같습니다.

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

답변:


108

나는 이것을 사용할 것이다 :

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, 감사합니다. 두 방법 모두 잘 작동했습니다. 한 필드에서 연도와 월을 함께 그룹화 할 수있는 방법이 있습니까? 다음 형식으로 표시하는 의미 : Dec-12 (12 월은 월, 12는 연도). 감사
user1858332

첫 번째 방법은이 작업을 수행하며 열의 형식을 지정하기 만하면됩니다. 나는 SQL의 외부를하고 조언을하려고하지만이 같은 것을 사용할 수 있습니다와 같은 수행 할 수가있는 경우SELECT STUFF(SUBSTRING(CONVERT(VARCHAR, CURRENT_TIMESTAMP, 6), 4, 6), 4, 1, '-');
GarethD

@GarethD 0과 날짜 사이에 datediff를 어떻게 사용했는지 설명해 주시겠습니까? 0은 날짜가 아닙니다.
irfandar

1
또한 Closing_Date = DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0) 왜 그냥 DATEADD (MONTH, DATEDIFF (MONTH, 0, Closing_Date), 0)의 기능은 무엇입니까
irfandar

3
@irfandar 0은 날짜가 아니지만 SQL-Server는 암시 적으로 날짜를 1900 년 1 월 1 일로 변환합니다. 두 번째 질문 Closing_Date =은 열 별칭 일 뿐이며 AS Closing_Date식 뒤에있는 것과 동일 합니다. 전적으로 주관적이지만 개인적으로 alias =표기법이 AS Alias. 내가 선호하는 이유에 대한 자세한 내용 은 Aaron Bertrand 의이 기사읽어보십시오 .
GarethD

41

DATEPART 함수를 사용하여 날짜에서 월을 추출합니다.

따라서 다음과 같이 할 수 있습니다.

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

14
Mysql의 경우 DATEPART 대신 MONTH () 또는 MONTHNAME ()을 사용할 수 있습니다.
frazras

이 쿼리를 자주 실행하는 경우 적절한 인덱스를 작성하는 것이 좋습니다.
user_0 dec. 2014-12-02

더하기 1은 간단한 답장입니다.
berdem

9
이것은 다른 해의 달을 같은 것으로 간주합니다. 일반적으로 예상되지 않습니다.
ivan_pozdeev

이것은 1 월 등에 "1"을 넣습니다. 월 이름을 알려주지 않습니다
user890332

14

이를 위해 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 함수는 MySQL 5.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

위의 SQL Server 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.