【问题标题】:SQL Count for a Date Column日期列的 SQL 计数
【发布时间】:2010-03-03 23:18:07
【问题描述】:

我有一个包含一组列的表,其中一个是日期列。

我需要计算该列值在同一月份出现的次数。如果 1 个月内的总和超过 3,则返回。

例如:

____________________
| DATE   |  ....    |
---------------------
1998-09-02
1998-09-03
1998-10-03
1998-10-04

这不能返回任何值。因为它没有必要的重复次数。

但确实如此:

____________________
| DATE   |  ....    |
---------------------
1998-09-02
1998-09-03
1998-09-12
1998-09-14
1998-10-02
1998-11-21

11 月份。

适用于 Oracle 数据库。

【问题讨论】:

  • 在您的示例中,我假设您的意思是 9 月而不是 11 月。您能否向我们展示您希望看到的输出示例?
  • 输出必须是计数,最好是月份。例如,(AUG, 14) 如果同年 ​​8 月有 14 条记录。很明显。
  • 请在您的问题中添加“oracle”标签:-D

标签: sql oracle date-manipulation


【解决方案1】:
SELECT
 COUNT(date)
 , TRUNC(DATE,'MON')
FROM TABLE
GROUP BY TRUNC(DATE,'MON')
HAVING COUNT(DATE) > 3

【讨论】:

  • ORA-00904: "MONTH": 标识符无效
  • 什么文档? MONTH 不是 Oracle 函数。无论如何,我今天感觉很慷慨,所以我编辑了你的答案:)
  • 非常感谢,我不知道他在使用 Oracle。
【解决方案2】:
create table x (date_col date);

insert into x values (date '1998-09-02');
insert into x values (date '1998-09-03');
insert into x values (date '1998-09-12');
insert into x values (date '1998-09-14');
insert into x values (date '1998-10-02');
insert into x values (date '1998-11-21');

SELECT TRUNC(date_col,'MM'), count(*)
FROM x
GROUP BY TRUNC(date_col,'MM')
HAVING count(*) > 3;

【讨论】:

    【解决方案3】:

    那么,如果 3 个列包含 1999-01-xx,您想要获取它吗?

    SELECT YEAR(date), MONTH(date) 
    FROM table GROUP BY YEAR(date), MONTH(date) 
    HAVING COUNT(*) > 3
    

    如果您需要包含上面结果的所有行,它应该看起来像这样

    SELECT * FROM table 
    INNER JOIN (
       SELECT YEAR(date) as y, MONTH(date) as m 
       FROM table GROUP BY YEAR(date), MONTH(date) 
       HAVING COUNT(*) > 3
    ) as virtualTable 
    ON virtualTable.y = YEAR(date) AND virtualTable.m = MONTH(date)
    

    【讨论】:

      【解决方案4】:

      这个例子会有所帮助:

      create table d1
      ( event_date date, event_description varchar2(100));
      
      insert into d1 values (sysdate,'Phone Call');
      insert into d1 values (sysdate,'Letter');
      insert into d1 values (sysdate-50,'Interview');
      insert into d1 values (sysdate-50,'Dinner with parents');
      insert into d1 values (sysdate-100,'Birthday');
      insert into d1 values (sysdate-100,'Holiday');
      insert into d1 values (sysdate-100,'Interview');
      insert into d1 values (sysdate-100,'Phone Call');
      
      commit;
      
      select * from d1;
      
      EVENT_DATE                EVENT_DESCRIPTION                                                                                    
      ------------------------- ----------------------------------------------- 
      04-MAR-10 14.47.58        Phone Call                                                                                           
      04-MAR-10 14.47.58        Letter                                                                                               
      13-JAN-10 14.47.58        Interview                                                                                            
      13-JAN-10 14.47.58        Dinner with parents                                                                                  
      24-NOV-09 14.47.58        Birthday                                                                                             
      24-NOV-09 14.47.58        Holiday                                                                                              
      24-NOV-09 14.47.58        Interview                                                                                            
      24-NOV-09 14.47.58        Phone Call                                                                                           
      8 rows selected
      

      您可以看到,11 月 9 日是唯一一个超过 3 个事件的月份。

      回到你原来的问题,如果一个月内,这个计数总和超过 3,则返回。以下 SQL 聚合将起作用。

      select trunc(event_date,'MONTH'),count('x') from d1 
      having count('x') > 3 group by trunc(event_date,'MONTH') 
      

      或者,使用 to_char 将 Date 类型转换为带有 MON-YYYY 图片的 Char,如下所示:

      select to_char(trunc(event_date,'MONTH'),'MON-YYYY') month,
          count('x') no_of_occurances from d1 having count('x') > 3 group trunc(event_date,'MONTH') 
      

      【讨论】:

      • 糟糕,我还没有看到 Gary 的帖子。我投票支持 Gary,忽略此帖子,因为它与 Gary 完全相同,但我在 12 小时后发布。对不起加里。
      【解决方案5】:

      理想情况下,您应该创建一个接受您需要的两个条件的存储过程,Month(integer) 和 limit(integer)

      在执行以下操作的参数化过程中

       SELECT MONTH(Date) AS TheMonth, COUNT(MONTH(Date)) AS TheMonthCount
          FROM MyTable
          GROUP BY MONTH(Date)
          HAVING (COUNT(MONTH(Date)) > @limit) AND (MONTH(Date) = @month)
      

      要同时输出相关月份,您可以使用以下命令

      SELECT CAST(YEAR(Date) AS NVARCHAR) + '.' + 
             CAST(MONTH(Date) AS NVARCHAR) AS 'The  ', 
      MONTH(Date ) AS TheMonth, COUNT(MONTH(Date)) AS TheMonthCount
          FROM Audit_Entry
          GROUP BY MONTH(Date), 
               CAST(YEAR(Date) AS NVARCHAR) + '.' +            
               CAST(MONTH(Date) AS NVARCHAR)
          HAVING (COUNT(MONTH(Date)) > @limit) AND (MONTH(Date) = @month)
      

      【讨论】:

        【解决方案6】:

        这应该适用于 mysql 和 mssql:

        SELECT MONTH(date), Sum(MONTH(date))
        FROM table
        GROUP BY date
        HAVING Sum(MONTH(date)) > 3
        

        【讨论】:

          【解决方案7】:

          我不确定您使用的是哪个数据库。

          在MySQL中查询会类似于@THEn提出的方法

          在 SQL 服务器上,您还有其他有趣的可能性。

          阅读此article 了解更多详情。

          【讨论】:

            【解决方案8】:

            您可以使用 Oracle 的 EXTRACT 方法:

            select theMonth, sum(monthCount)
            from (
              select 
                extract(MONTH FROM t.theDateColumn) as theMonth,
                1 as monthCount
              )
            group by theMonth
            having sum(monthCount) >= 3
            

            目前我手头没有 Oracle 数据库,因此此代码可能无法按原样运行 - 对此我深表歉意。

            【讨论】:

              【解决方案9】:

              可能是错的,但只是猜测:

              SELECT SUM(date) FROM table
              GROUP BY date where SUM(date) > 3
              

              【讨论】:

              • 没有。大于 3 的日期之和也必须对应于同一月份。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-01-07
              • 1970-01-01
              • 1970-01-01
              • 2021-06-28
              • 1970-01-01
              相关资源
              最近更新 更多