Program Club

월 및 연도 별 SQL 그룹화

proclub 2020. 12. 6. 22:15
반응형

월 및 연도 별 SQL 그룹화


"월-년"- "9-2011"과 같은 '날짜'열을 표시하기 위해 다음 SQL 쿼리에 무엇을 작성해야하는지 잘 모르겠습니다.

SELECT MONTH(date) + '.' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY MONTH(date), YEAR(date)

그래서 제가하고 싶은 것은 첫 번째 열의 데이터를 월만 표시하는 대신 월과 연도를 표시하도록 변경하는 것입니다.


SELECT CAST(MONTH(date) AS VARCHAR(2)) + '-' + CAST(YEAR(date) AS VARCHAR(4)) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY CAST(MONTH(date) AS VARCHAR(2)) + '-' + CAST(YEAR(date) AS VARCHAR(4))

또는 @ 40-Love가 언급했듯이 선행 0으로 캐스팅 할 수 있습니다.

GROUP BY 
  CAST(YEAR(date) AS VARCHAR(4)) + '-' + right('00' + CAST(MONTH(date) AS VARCHAR(2)), 2) 

MS SQL 구문처럼 보이는 MS SQL이라고 생각합니다.

따라서 select ex에서와 같은 것을 그룹 라인에 넣어야합니다.

Select MONTH(date)+'-'+YEAR(date), ....
...
...
...
group by MONTH(date)+'-'+YEAR(date)

내가 올바르게 이해한다면. 요청 된대로 결과를 그룹화하려면 Group By 절에 select 문과 동일한식이 있어야합니다.

GROUP BY MONTH(date) + '.' + YEAR(date)

날짜를 "월-일"형식으로 표시하려면 '.' to '-'전체 구문은 다음과 같습니다.

SELECT MONTH(date) + '-' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS
SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY MONTH(date) + '.' + YEAR(date)

위의 SQL Server 2012에서는 format () 함수를 사용하는 것을 선호합니다.

SELECT format(date,'MM.yyyy') AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY format(date,'MM.yyyy')

postgresql에서는 날짜 형식 함수 (to_char)와 날짜별로 그룹화하여 비슷한 쿼리를 작성할 수 있습니다.

SELECT to_char (datum, 'MM-YYYY') AS mjesec 
FROM test 
GROUP BY datum 
ORDER BY datum;

SQL-Server에서도 이런 일은 확실히 가능하지 않습니까?


곱셈을 시도하여 연도와 월을 조정하여 하나의 숫자가되도록 할 수 있습니다. 내 테스트에서 이것은 format(date,'yyyy.MM'). 나는 정렬 목적으로 1 년 전을 선호합니다. MS SQL Server Express 버전 12.0에서 생성 된 코드.

SELECT (YEAR(Date) * 100) + MONTH(Date) AS yyyyMM
FROM [Order]
...
GROUP BY (YEAR(Date) * 100) + MONTH(Date)
ORDER BY yyyyMM

datetime 데이터 유형에 필드를 유지하려면 다음을 사용해보십시오.

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, o.[date]), 0) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order] o
WHERE (idCustomer = 1) AND (o.[date] BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, o.[date]), 0)

시간, 일, 주, 년별로 그룹으로 변경하는 것도 쉽습니다.
누군가에게 유용했으면합니다.

문안 인사!

참고 URL : https://stackoverflow.com/questions/5406170/sql-grouping-by-month-and-year

반응형