You need to do it in the same way as previous:
DECLARE @tdata TABLE (grp INT, val INT, mth NVARCHAR(30))
DECLARE @dtmp TABLE (grp INT, val INT, mth NVARCHAR(30))
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 1, 'june')
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 2, 'june')
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 5, 'june')
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 7, 'june')
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 10, 'june')
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 2, 'july')
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 3, 'july')
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 5, 'july')
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 8, 'july')
INSERT INTO @tdata (grp, val, mth)
VALUES(301, 9, 'july')
INSERT INTO @tdata (grp, val, mth)
VALUES(303, 5, 'june')
INSERT INTO @tdata (grp, val, mth)
VALUES(303, 6, 'june')
INSERT INTO @tdata (grp, val, mth)
VALUES(303, 8, 'june')
INSERT INTO @tdata (grp, val, mth)
VALUES(303, 9, 'june')
INSERT INTO @tdata (grp, val, mth)
VALUES(303, 2, 'july')
INSERT INTO @tdata (grp, val, mth)
VALUES(303, 4, 'july')
INSERT INTO @tdata (grp, val, mth)
VALUES(303, 8, 'july')
INSERT INTO @tdata (grp, val, mth)
VALUES(303, 10, 'july')
;WITH FullData AS
(
SELECT grp, val, mth, 1 AS nval
FROM @tdata
WHERE val<=10
UNION ALL
SELECT grp, val, mth, nval + 1 AS nval
FROM FullData
WHERE nval < 10
)
INSERT INTO @dtmp (grp, val, mth)
SELECT DISTINCT t1.grp, t1.nval as val, t1.mth
FROM FullData AS t1 LEFT JOIN @tdata AS t2 ON t1.grp = t2.grp
SELECT DISTINCT grp, val, mth
FROM @dtmp AS MissingVal
WHERE MissingVal.val NOT IN (SELECT val FROM @tdata WHERE grp = MissingVal.grp AND mth = MissingVal.mth)
ORDER BY grp, mth, val
results:
grp val mth
301 1 july
301 4 july
301 6 july
301 7 july
301 10 july
301 3 june
301 4 june
301 6 june
301 8 june
301 9 june
303 1 july
303 3 july
303 5 july
303 6 july
303 7 july
303 9 july
303 1 june
303 2 june
303 3 june
303 4 june
303 7 june
303 10 june