2012-04-11 15 views
-5

Ich möchte eine Abfrage, um die gesamte Geburtstagsmotte basierend auf Monat zu berechnen. Hier sind die Beispieldaten. Der Geburtstag von zwei Personen ist April 1980.sql: berechnen Sie die gesamte Geburtstagsmotte basierend auf Monat

Wie schreibe ich diese Abfrage?

John 02/21/1980 
Peter 02/22/1980 
Lucy 04/21/1980 

------ result ----- 
01/1980  0 
02/1980  2 
03/1980  0 
04/1980  1 
05/1980  0 
..... 
+3

MySQL/SQLServer/Oracle? Basierend auf Monat und Jahr oder nur Monat? – sll

+2

Haben Sie versucht, etwas anderes zu fragen als hier? – JNK

+0

versuchen Standard sql – user595234

Antwort

0

wie über dieses für SQL-Server

create table #temp 
(
    name varchar(50), 
    DOB datetime 
) 

insert into #temp values ('john', '2/21/1980') 
insert into #temp values ('peter', '2/22/1980') 
insert into #temp values ('lucy', '4/21/1980') 

select convert(varchar(2), MONTH(DOB)) + '/' + Convert(varchar(4), YEAR(DOB)) as [MM/YYYY] 
    , count(*) as TotalCount 
from #temp 
group by convert(varchar(2), MONTH(DOB)) + '/' + Convert(varchar(4), YEAR(DOB)) 

drop table #temp 

EDIT - Dieses Sie alle Datensätze für die Tage, erhalten in der Tabelle in den Daten enthalten. Es wird die Min/Max-Datum in der Tabelle verwenden Sie den Datumsbereich zu erhalten, können Sie dann diesen Bereich verwenden, um die Zählung der Geburtstage in jedem Monat zu erhalten:

create table #temp 
(
    name varchar(50), 
    DOB datetime 
) 

insert into #temp values ('john', '2/21/1980') 
insert into #temp values ('peter', '2/22/1980') 
insert into #temp values ('lucy', '4/21/1980') 

;with cte as 
(
    select min(DOB) as MinDate, max(DOB) as MaxDate 
    from #temp 
    union all 
    SELECT dateadd(mm, 1, t.MinDate), t.MaxDate 
    from cte t 
    where dateadd(mm, 1, t.MinDate) <= t.MaxDate 
) 
select convert(varchar(2), MONTH(c.MinDate)) + '/' + Convert(varchar(4), YEAR(c.MinDate)) 
    , IsNull(t.TotalCount, 0) as TotalCount 
from cte c 
LEFT JOIN 
(
    SELECT convert(varchar(2), MONTH(DOB)) + '/' + Convert(varchar(4), YEAR(DOB)) as [MM/YYYY] 
     , count(*) as TotalCount 
    FROM #temp 
    group by convert(varchar(2), MONTH(DOB)) + '/' + Convert(varchar(4), YEAR(DOB)) 
) t 
    on convert(varchar(2), MONTH(C.MinDate)) + '/' + Convert(varchar(4), YEAR(C.MinDate)) 
     = t.[MM/YYYY] 

drop table #temp 
+0

Nicht schlecht, aber ich denke, er wird das Ergebnis für jeden Monat wollen .. –

+0

ja , Ich möchte Ergebnis für jeden Monat erhalten – user595234

+0

@ user595234 feste Antwort, um eine Liste von Daten zwischen dem Min/Date Datum in der Tabelle und geben Sie eine Zählung für alle Datensätze – Taryn

1

In MySQL Sie würden dies tun:

select concat(month(dob), '/', year(dob)) monthYear, count(*) cnt from t 
group by monthYear 
order by year(dob), month(dob) 

Um jedoch die "fehlenden Daten" zu erhalten, müssen Sie Daten generieren, denn 01/1980 ist in keiner Tabelle, soweit ich sehen kann. Überprüfen Sie diese answer, um zu sehen, wie.

3

Sie können Schleife für alle Monate wie folgt aus:

DECLARE @month INT 
DECLARE @year INT 
DECLARE @result TABLE (MonthYear varchar(7),BirthdaysCount INT) 
SET @month = 1 
SET @year = 1980 

WHILE(@month < 13) 
    BEGIN 
    INSERT INTO @result 
    SELECT (CAST(@month as VARCHAR) + '/' + CAST(@year as VARCHAR)), 
      COUNT(*) 
    FROM test 
    WHERE MONTH(birth) = @month AND YEAR(birth) = @year 
    SET @month = @month + 1 
    END 

select * from @result 

Siehe Geige: http://sqlfiddle.com/#!3/20692/2

+1

Dies wird jedes Mal weniger "Standard-SQL" :) –

Verwandte Themen