2012-04-11 73 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