2010-03-03 4 views
8

Ich habe eine Tabelle, die eine Reihe von Spalten enthält, von denen eine eine Datumsspalte ist.SQL Count für eine Datumsspalte

Ich muss zählen, wie viele Vorkommen der Werte dieser Spalte sich auf denselben Monat beziehen. Und zurück, wenn für einen Monat, dass Graf fasst mehr als 3.

Zum Beispiel:

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

Dies muss keinen Wert zurück. Weil es nicht die notwendige Anzahl von Wiederholungen hat.

Aber es tut:

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

Für den November Monat.

Ist für eine Oracle DB.

+0

In Ihrem Beispiel nehme ich an meinen Sie September und nicht November. Können Sie uns ein Beispiel für die Ausgabe zeigen, die Sie sehen möchten? – orandov

+0

Die Ausgabe muss die Anzahl und idealerweise der Monat sein. Zum Beispiel (AUG, 14), wenn es 14 Datensätze für den August des gleichen Jahres gibt. Offensichtlich. – Sheldon

+0

Bitte fügen Sie 'Orakel' Tag zu Ihrer Frage hinzu :-D – bic

Antwort

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

ORA-00904: "MONAT": ungültige Kennung – Sheldon

+2

what docs? MONTH ist keine Oracle-Funktion. Wie auch immer, ich fühle mich heute großzügig, also habe ich deine Antwort bearbeitet :) –

+0

Vielen Dank, mir war nicht bewusst, dass er Oracle verwendet. – THEn

-2

könnte falsch sein, aber eine Vermutung:

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

Nein. Die Summe der Daten größer als 3 muss auch im selben Monat entsprechen. – Sheldon

0

Dies sollte für MySQL und MSSQL arbeiten:

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

Also, wenn 3 coloums enthalten 1999-01-xx Sie wollen bekommen das holte?

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

Wenn Sie alle Zeilen benötigen, die das obere Ergebnis enthalten sollte es so aussehen, wie die

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

Ich bin nicht sicher, welche Datenbank Sie verwenden.

In MySQL Anfrage wird an die Methode von @THEn

Auf SQL Server Sie weitere interessante Möglichkeiten haben ähnlich sein.

Lesen Sie diese article für weitere Details.

1

Im Idealfall sollten Sie eine gespeicherte Prozedur erstellen, die die beiden Kriterien akzeptiert die Sie benötigen, Monat (integer) und Limit (integer)

In einem parametrisierte Prozedur, die die folgenden

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) 

auch um ausführt Ausgang der entsprechende Monat könnten Sie die folgende

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

verwenden Sie Oracle EXTRACT Methode verwenden:

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

Ich habe im Moment keine Oracle-Datenbank zur Hand, daher funktioniert dieser Code möglicherweise nicht so wie - ich entschuldige mich dafür.

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

wird Dieses Beispiel helfen:

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 

Sie können sehen, dass Nov-09 der einzige Monat ist, die mehr als drei Ereignisse.

Zurück zu Ihrer ursprünglichen Frage, die war Und zurück, wenn für einen Monat, die Summen zählen mehr als 3. Das folgende SQL-Aggregat funktioniert.

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

Alternativ Verwendung to_char den Datumstyp auf einen Char mit einem MON-YYYY Bild zu konvertieren, wie folgt:

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

Hoppla, ich habe Garys Post nicht in der Nähe gesehen. Ich habe Gary gewählt, ignoriere diesen Beitrag, da er genauso ist wie Gary, aber ich habe 12 Stunden später gepostet. Entschuldige, Garry. –