2010-03-03 90 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