2012-04-11 72 views
-5

我想编码查询来计算基于月份的总生日飞蛾。这里是示例数据。两人的星期二是1980年4月。sql:根据月份计算总生日飞蛾

如何撰写此查询?

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的/甲骨文?根据月份和年份还是仅月份? – sll 2012-04-11 17:51:13

+2

除了在这里问问以外,你还尝试过什么吗? – JNK 2012-04-11 17:52:17

+0

尝试标准sql – user595234 2012-04-11 18:05:27

回答

0

这个怎么样的SQL服务器

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 

编辑 - 这将让你的日期中的所有记录包含在表的日期。它将使用最小/最大日在表中获取日期范围内,然后使用这个范围内得到生日每个月计数:

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

不错,但我想他会想每个月的结果.. – 2012-04-11 18:00:32

+0

是,我想要得到每个月的结果 – user595234 2012-04-11 18:04:38

+0

@ user595234固定答案提供表中最小/日期日期之间的日期列表,并给出所有记录的计数 – Taryn 2012-04-11 18:26:38

1

在MySQL中你可以这样做:

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

但是,为了获得“缺失日期”,您必须生成数据,因为01/1980不在任何表格中,据我所知。检查这个answer看看如何。

3

您可以循环像这样每个月:

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 

见琴:http://sqlfiddle.com/#!3/20692/2

+1

这使得每次都少了“标准sql”:) – 2012-04-11 18:14:18