2010-03-03 19 views
8

Ho una tabella che contiene un insieme di colonne, una delle quali è una colonna Data.Conteggio SQL per una colonna di data

Ho bisogno di contare quante occorrenze dei valori di quella colonna si riferiscono allo stesso mese. E restituire se per un mese, che contano riassume più di 3.

Ad esempio:

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

Questo deve restituire alcun valore. Perché non ha il numero necessario di ripetizioni.

Ma questo lo fa:

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

Per il mese di novembre.

È per un DB Oracle.

+0

In te esempio Presumo si intende settembre e non novembre. Puoi mostrarci un esempio dell'output che vorresti vedere? – orandov

+0

L'output deve essere il conteggio e idealmente il mese. Ad esempio, (AGOSTO 14) se ci sono 14 record per agosto dello stesso anno. Ovviamente. – Sheldon

+0

Per favore aggiungi il tag 'oracle' alla tua domanda :-D – bic

risposta

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

ORA-00904: "MESE": identificatore non valido – Sheldon

+2

quali documenti? MONTH non è una funzione Oracle. comunque, mi sento generoso oggi, quindi ho modificato la tua risposta :) –

+0

Grazie mille, non ero consapevole del fatto che stava usando Oracle. – THEn

-2

Potrebbe essere sbagliato, ma una supposizione:

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

No. La somma delle date maggiori di 3 deve anche corrispondere allo stesso mese. – Sheldon

0

Questo dovrebbe funzionare per MySQL e MSSQL:

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

Quindi, se 3 coloums contengono 1999-01-xx si desidera ottenere quello preso?

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

Se avete bisogno di tutte le righe che contengono il risultato superiore Dovrebbe essere qualcosa di simile

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

Non sono sicuro quale database che si sta utilizzando.

In MySQL Query sarà simile al metodo proposto da @THEn

Sul server di SQL avete altre interessanti possibilità.

Leggere questo article per ulteriori dettagli.

1

Idealmente si dovrebbe creare una stored procedure che accetta i due criteri di cui avete bisogno, Month (intero) e il limite (intero)

In una procedura con parametri che esegue il seguente

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) 

A anche in uscita il mese in questione è possibile utilizzare il seguente

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

è possibile utilizzare il metodo ESTRATTO di Oracle:

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

Non ho un database Oracle al momento, quindi questo codice potrebbe non funzionare così com'è - Mi scuso per questo.

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

Questo esempio aiuterà:

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 

Si può vedere che nov-09 è l'unico mese che più di 3 eventi.

Facendo riferimento alla domanda originale, che era E restituire se per un mese, il conteggio somma più di 3. Il seguente aggregato SQL funzionerà.

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

In alternativa, utilizzare TO_CHAR per convertire il tipo Date a un Char con una foto MON-YYYY come segue:

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

Oops, non avevo visto il post di Gary in mezzo a tutto il resto. Ho votato Gary, ignoro questo post perché è esattamente lo stesso di Gary, ma l'ho postato 12 ore dopo. Scusa, Garry. –

Problemi correlati