2010-03-03 68 views
8

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

我需要计算该列的值出现次数指的是同一个月。并且返回是否一个月,那算不算总结超过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数据库。

+0

在你的例子,我假定你的意思是九月和十一月没有。你能向我们展示一个你想看到的输出的例子吗? – orandov 2010-03-03 23:28:48

+0

输出必须是计数,最好是月份。 例如,(8月14日)是否有同年8月份的14条记录。明显。 – Sheldon 2010-03-03 23:34:43

+0

请在您的问题中添加'oracle'标签:-D – bic 2010-03-03 23:46:06

回答

7
SELECT 
COUNT(date) 
, TRUNC(DATE,'MON') 
FROM TABLE 
GROUP BY TRUNC(DATE,'MON') 
HAVING COUNT(DATE) > 3 
+0

ORA-00904:“MONTH”:无效的标识符 – Sheldon 2010-03-04 00:36:43

+2

什么文档? MONTH不是Oracle的功能。无论如何,今天我感觉很慷慨,所以我编辑了你的答案:) – 2010-03-04 04:42:54

+0

非常感谢,我不知道他在使用Oracle。 – THEn 2010-03-05 18:05:49

-2

可能是错的,但猜测:

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

否。大于3的日期总和也必须对应于同一月份。 – Sheldon 2010-03-03 23:25:57

0

这应该MySQL和MSSQL工作取得?

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) 
1

所以,如果3个coloums包含1999至1901年,XX你想:

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

我不知道你正在使用的数据库。

在MySQL查询将类似于您有其他有趣的可能性提出@THEn

上的SQL Server的方法。

阅读article了解更多详情。

1

理想情况下,你应该创建一个接受你所需要的两个标准的存储过程,月(整数)和上限(整数)

在执行以下

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) 
0

你可以使用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数据库,因此此代码可能无法正常工作 - 对此我表示歉意。

3
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; 
1

这个例子可以帮助:

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 

你可以看到,NOV-09是唯一的这一个月超过3个事件。

再回头来看你原来的问题,这是而且如果一个月回来,那算的总数超过3。以下SQL聚合将起作用。

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

另外,使用TO_CHAR,将日期类型转换为字符与MON-YYYY图片如下:

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') 
+0

糟糕,我还没有看到加里的帖子。我投票加里,忽略这篇文章,因为它与加里完全一样,但我在12小时后发布。对不起,加里。 – 2010-03-04 15:02:05