2012-07-11 36 views
8

Tôi có ví dụ này dữ liệu:SQL Nhóm Bằng - hồ sơ đếm mỗi tháng/năm, lỗi trên chèn - KHÔNG PHẢI LÀ MỘT THÁNG HỢP LỆ

Country | Members | Joined 
USA  | 250  | 1/1/2012 
USA  | 100  | 1/8/2012 
Russia | 75  | 1/20/2012 
USA  | 150  | 2/10/2012 

Khi tôi truy vấn dữ liệu này, tôi muốn kết hợp lại tất cả các bản ghi trong một tháng đã cho. Kết quả của truy vấn sẽ trông như thế:

Country | Members | Joined 
USA  | 350  | 1/2012 
Russia | 75  | 1/2012 
USA  | 150  | 2/2012 

Là một lựa chọn đó là đủ đơn giản:

select country, count(*) as members , to_char(trunc(joined), 'MM-YYYY') 
from table 
group by country, to_char(trunc(joined), 'MM-YYYY') 

truy vấn đó sẽ cho tôi dữ liệu theo định dạng tôi muốn, tuy nhiên vấn đề của tôi là khi tôi đi vào chèn vào một bảng tổng hợp mới Tôi gặp lỗi vì lệnh to_char() trong câu lệnh chọn đang được đặt vào cột DATETIME (lỗi: ORA-01843 - không phải là tháng hợp lệ)

Khi tôi thay đổi to_char() trong select to to_date(), nó vẫn không hoạt động (cùng lỗi, ORA-01843 - không phải là tháng hợp lệ):

select country, count(*) as members, to_date(trunc(joined), 'MM-YYYY') 
from table 
group by country, to_date(trunc(joined), 'MM-YYYY') 

Bất kỳ đề xuất về cách sửa đổi truy vấn này theo cách như vậy mà tôi có thể chèn kết quả vào một bảng mới có "tham gia" cột là kiểu DATETIME?

cảm ơn trước vì bất kỳ mẹo/đề xuất/nhận xét nào!

Trả lời

14

Bạn có thể làm một cái gì đó như to_date('01/'||trunc(joined), 'DD/MM/YYYY'), biến nó thành ngày hợp lệ trước tiên. Bạn chỉ cần phải quyết định xem có nên sử dụng trong ngày đầu tiên hoặc cuối cùng của tháng (cuối cùng là phức tạp hơn)

lựa chọn khác là sử dụng chức năng TRÍCH:

select country, count(*) as members, EXTRACT(MONTH FROM joined) as mn, EXTRACT(YEAR FROM JOINED) as yr,MIN(JOINED) as dt 
from table 
group by country, EXTRACT(MONTH FROM joined), EXTRACT(YEAR FROM JOINED) 

và sau đó từ đó, bạn có thể chỉ cần chọn cột dt và chèn cột đó vào

+0

trong đầu tôi đây chính xác là những gì tôi đang cố gắng tìm ra. cảm ơn nhiều! –

5

Bạn nên sử dụng hàm trunc để cắt bớt ngày tháng đầu tiên của tháng. Điều đó giúp loại bỏ việc chuyển đổi ngày thành chuỗi và cần phải chuyển đổi chuỗi trở lại thành ngày.

select country, 
     count(*) as members , 
     trunc(joined, 'MM') 
    from table 
group by country, 
      trunc(joined, 'MM') 
+0

đề xuất tốt, tôi sẽ xem xét điều này. tôi đánh giá cao phản hồi của bạn –

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