我想編碼查詢來計算基於月份的總生日飛蛾。這裏是示例數據。兩人的星期二是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
.....
我想編碼查詢來計算基於月份的總生日飛蛾。這裏是示例數據。兩人的星期二是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
.....
這個怎麼樣的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
不錯,但我想他會想每個月的結果.. – 2012-04-11 18:00:32
是,我想要得到每個月的結果 – user595234 2012-04-11 18:04:38
@ user595234固定答案提供表中最小/日期日期之間的日期列表,並給出所有記錄的計數 – Taryn 2012-04-11 18:26:38
在MySQL中你可以這樣做:
select concat(month(dob), '/', year(dob)) monthYear, count(*) cnt from t
group by monthYear
order by year(dob), month(dob)
但是,爲了獲得「缺失日期」,您必須生成數據,因爲01/1980
不在任何表格中,據我所知。檢查這個answer看看如何。
您可以循環像這樣每個月:
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
這使得每次都少了「標準sql」:) – 2012-04-11 18:14:18
的MySQL/SqlServer的/甲骨文?根據月份和年份還是僅月份? – sll 2012-04-11 17:51:13
除了在這裏問問以外,你還嘗試過什麼嗎? – JNK 2012-04-11 17:52:17
嘗試標準sql – user595234 2012-04-11 18:05:27