2012-07-11 74 views
8

我有這樣的例子數據:SQL分組依據 - 每月/每年,錯誤計數的唱片插入 - 不是一個有效的月份

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

當我查詢這個數據,我想聚集在所有記錄給定月份。查詢的結果會是什麼樣子:

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

作爲選擇很簡單:

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

該查詢都會給我數據,我想要的格式,但我的問題是,當我去插入到一個新的數據透視表我得到一個錯誤,因爲select語句中的to_char()被放入DATETIME列(錯誤:ORA-01843 - 不是有效月份)

當我更改to_char ()在select到to_date()中,它仍然不起作用(同樣的錯誤,ORA-01843 - 不是有效的月份):

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

如何在這樣我可以插入結果到一個新的表,其方式修改此查詢的任何建議「參加」列的類型是DATETIME的?

在此先感謝您的任何提示/建議/意見!

回答

14

你可以做一些像to_date('01/'||trunc(joined), 'DD/MM/YYYY'),這將首先變成一個有效的日期。 你只需要決定是否使用該月的第一天或最後一天(去年爲更復雜)

另一種選擇是使用EXTRACT功能:

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) 

,然後從,你可以只需選擇dt列並插入即可

+0

在我腦海中,這正是我想弄明白的。非常感謝! – 2012-07-11 19:19:33

5

您應該使用trunc函數將日期截斷至本月的第一個月份。這消除了將日期轉換爲字符串以及將字符串轉換回日期的需要。

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

不錯的建議,我會研究一下。我感謝您的反饋 – 2012-07-11 19:20:00