programing

월별 SQL 결과 그룹

sourcejob 2023. 7. 23. 14:12
반응형

월별 SQL 결과 그룹

12개월이라는 기간 동안 분산된 일부 결과를 반환하려고 합니다. 예:

MONTH       IN   OUT
January    210    191
February   200    111
March      132    141
April      112    141
May        191    188 
etc...

날짜 범위에 결과를 분산하고 첫 번째 열을 월 이름으로 채우려면 어떻게 해야 합니까?

MSSQL에서는 다음과 같습니다.

SELECT  COUNT(problem.problem_type = 'IN') AS IN, 
    COUNT(problem.problem_type = 'OUT') AS OUT, 
    DATEPART(year, DateTime) as Year,
    DATEPART(month, DateTime) as Month
FROM problem
WHERE   (DateTime >= dbo.FormatDateTime('2010-01-01')) 
    AND 
    (DateTime < dbo.FormatDateTime('2010-01-31'))
GROUP BY DATEPART(year, DateTime),
    DATEPART(month, DateTime);

그러나 이는 Oracle 데이터베이스에 대한 것이므로 DATEPART 및 DateTime을 사용할 수 없습니다.

내 문제 표는 대략 다음과 같습니다.

problem_ID Problem_type   IN_Date                     OUT_Date
   1           IN        2010-01-23 16:34:29.0       2010-02-29 13:06:28.0
   2           IN        2010-01-27 12:34:29.0       2010-01-29 12:01:28.0
   3           OUT       2010-02-13 13:24:29.0       2010-09-29 15:04:28.0
   4           OUT       2010-02-15 16:31:29.0       2010-07-29 11:03:28.0

사용:

  SELECT SUM(CASE WHEN p.problem_type = 'IN' THEN 1 ELSE 0 END) AS IN, 
         SUM(CASE WHEN p.problem_type = 'OUT' THEN 1 ELSE 0 END) AS OUT, 
         TO_CHAR(datetime, 'YYYY') AS year,
         TO_CHAR(datetime, 'MM') AS month
    FROM PROBLEM p
   WHERE p.DateTime >= TO_DATE('2010-01-01', 'YYYY-MM-DD') 
     AND p.DateTime < TO_DATE('2010-01-31', 'YYYY-MM-DD') 
GROUP BY TO_CHAR(datetime, 'YYYY'), TO_CHAR(datetime, 'MM')

다음을 사용할 수도 있습니다.

  SELECT SUM(CASE WHEN p.problem_type = 'IN' THEN 1 ELSE 0 END) AS IN, 
         SUM(CASE WHEN p.problem_type = 'OUT' THEN 1 ELSE 0 END) AS OUT, 
         TO_CHAR(datetime, 'MM-YYYY') AS mon_year
    FROM PROBLEM p
   WHERE p.DateTime >= TO_DATE('2010-01-01', 'YYYY-MM-DD') 
     AND p.DateTime < TO_DATE('2010-01-31', 'YYYY-MM-DD') 
GROUP BY TO_CHAR(datetime, 'MM-YYYY')

참조:

당신은 아마도 그런 것을 원할 것입니다.

SELECT SUM( (CASE WHEN problem_type = 'IN' THEN 1 ELSE 0 END) ) in,
       SUM( (CASE WHEN problem_type = 'OUT' THEN 1 ELSE 0 END) ) out,
       EXTRACT( year FROM DateTime ) year,
       EXTRACT( month FROM DateTime ) month
  FROM problem
 WHERE DateTime >= date '2010-01-01'
   AND DateTime < date '2010-01-31'
 GROUP BY EXTRACT( year FROM DateTime ),
          EXTRACT( month FROM DateTime )

언급URL : https://stackoverflow.com/questions/4138371/sql-results-group-by-month

반응형