2010-11-09 32 views
10

Tôi đang cố gắng để trở lại một số kết quả trải rộng trên một cán 12 tháng thời gian ví dụ:SQL Kết quả nhóm theo tháng

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

Làm thế nào để truyền bá các kết quả trên một phạm vi ngày, Populating cột đầu tiên với tháng Tên?

TRÊN MSSQL nó sẽ là một cái gì đó như:

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); 

Nhưng điều này là chống lại một cơ sở dữ liệu Oracle để DATEPART và DateTime không có sẵn.

bảng Vấn đề của tôi là khoảng:

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 

Trả lời

21

Sử dụng:

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') 

Bạn cũng có thể sử dụng:

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') 

tham khảo:

+2

đánh bại tôi bằng cách 30 giây! –

+0

Tại sao chúng ta không thể sử dụng 'nhóm theo mon_year'? MySQL cho phép sử dụng tên cột bí danh trong mệnh đề nhóm. –

+0

@Scott Chu: Oracle không cho phép sử dụng bí danh cột trong điều khoản Nhóm. Bạn phải khớp thủ công biểu thức được sử dụng trong cột. Mileage có thể thay đổi với các DB khác. – ZeroK

6

Bạn có thể muốn một cái gì đó giống như

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) 
+0

Nhóm bằng cách trích xuất dường như không hoạt động trên Oracle 10. Không chắc chắn nếu tôi đang sử dụng nó đúng. –

Các vấn đề liên quan