SQL Group By - 计算每月/每年的记录,插入错误 - 非有效月份

Pat*_*ady 10 sql oracle pivot group-by

我有这个示例数据:

Country | Members   | Joined
USA     | 250       | 1/1/2012
USA     | 100       | 1/8/2012
Russia  | 75        | 1/20/2012
USA     | 150       | 2/10/2012
Run Code Online (Sandbox Code Playgroud)

当我查询这些数据时,我想汇总给定月份的所有记录.查询的结果如下所示:

Country | Members   | Joined
USA     | 350       | 1/2012
Russia  | 75        | 1/2012
USA     | 150       | 2/2012
Run Code Online (Sandbox Code Playgroud)

作为一个足够简单的选择:

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

该查询将以我想要的格式提供数据,但是我的问题是,当我将其插入到新的数据透视表中时,我收到错误,因为select语句中的to_char()被放入DATETIME列中(错误:ORA-01843 - 非有效月份)

当我将select中的to_char()更改为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')
Run Code Online (Sandbox Code Playgroud)

有关如何修改此查询的建议,我可以将结果插入到"JOINED"列为DATETIME类型的新表中?

提前感谢任何提示/建议/意见!

jle*_*jle 16

你可以做类似的事情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)
Run Code Online (Sandbox Code Playgroud)

然后,你可以选择dt列并插入它


Jus*_*ave 8

您应该使用该trunc函数将日期截断到该月的第一天.这消除了将日期转换为字符串以及将字符串转换回日期的需要.

select country, 
       count(*) as members , 
       trunc(joined, 'MM')
  from table
 group by country,
          trunc(joined, 'MM')
Run Code Online (Sandbox Code Playgroud)