2012-07-11 49 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