WITH bm (maxbucket) AS
(
SELECT MAX(bucket)
FROM mydata
),
buckets (bucket) AS
(
SELECT 1
UNION ALL
SELECT bucket + 1
FROM buckets
JOIN bm
ON bucket < maxbucket
)
SELECT bucket, p.*
FROM (
SELECT b.bucket, DATEPART(month, dt) AS mon
FROM buckets b
LEFT JOIN
mydata m
ON m.bucket = b.bucket
) q
PIVOT (
COUNT(mon)
FOR
mon IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
) p