-5

月に基づいて誕生日の蛾の合計を計算するクエリをコーディングしたいと思います。これがサンプルデータです。二人のビットデーは1980年4月です。

このクエリの書き方は?

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
.....
4

3 に答える 3

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

于 2012-04-11T18:07:59.967 に答える
1

MySQL では、次のようにします。

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

ただし、「欠落している日付」を取得するには、データを生成する必要があります01/1980。これは、私が見る限り、どのテーブルにもないためです。この回答をチェックして、その方法を確認してください。

于 2012-04-11T18:05:30.227 に答える
0

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

編集 - これにより、テーブルの日付に含まれる日付のすべてのレコードが取得されます。テーブルの最小/最大日付を使用して日付範囲を取得し、この範囲を使用して各月の誕生日の数を取得します。

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-11T17:56:30.927 に答える