11

我有这个示例数据:

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() 更改为 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')

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

提前感谢任何提示/建议/评论!

4

2 回答 2

20

您可以执行类似 的操作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 列并将其插入

于 2012-07-11T18:25:35.050 回答
9

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

select country, 
       count(*) as members , 
       trunc(joined, 'MM')
  from table
 group by country,
          trunc(joined, 'MM')
于 2012-07-11T18:40:11.733 回答