【问题标题】:SQL Group By - counting records per month/year, error on insert - NOT A VALID MONTHSQL Group By - 每月/每年计算记录,插入错误 - 不是一个有效的月份
【发布时间】:2012-07-11 10:25:18
【问题描述】:

我有这个示例数据:

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 - 不是有效月份)

当我将 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')

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

提前感谢任何提示/建议/cmets!

【问题讨论】:

    标签: sql oracle group-by pivot


    【解决方案1】:

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

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

    【讨论】:

    • 好建议,我会调查一下。感谢您的反馈
    【解决方案2】:

    您可以执行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 列并插入它

    【讨论】:

    • 在我的脑海中,这正是我想要弄清楚的。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多