Here you go! Complete script, just make sure to test really well for every possible case and don't forget to mark it as an answer if it fits your needs:
IF OBJECT_ID('TEST1') IS NOT NULL
DROP TABLE TEST1
GO
CREATE TABLE TEST1
(
STUDENTID INT ,
ATTCODE VARCHAR(2) ,
ATTDATE DATE
)
GO
INSERT INTO TEST1
VALUES
('101','AE','20110101'),
('101','H','20110102'),
('101','T','20110105'),
('101','H','20110107'),
('101','AU','20110108'),
('102','AE','20110101'),
('102','AE','20110103'),
('102','H','20110104'),
('102','V','20110105')
GO
IF OBJECT_ID('TEST2') IS NOT NULL
DROP TABLE TEST2
GO
CREATE TABLE TEST2
(
STUDENTID INT,
FROMDATE DATE,
TODATE DATE,
CONSECUTIVEABS INT,
ATTCODES VARCHAR(255)
)
GO
INSERT INTO TEST2
SELECT TEST1.STUDENTID,TEST1.ATTDATE,TEST1.ATTDATE,1,TEST1.ATTCODE
FROM TEST1
JOIN
(
SELECT STUDENTID,MIN(ATTDATE) ATTDATE
FROM TEST1
GROUP BY STUDENTID
) MI ON MI.STUDENTID=TEST1.STUDENTID AND MI.ATTDATE=TEST1.ATTDATE
DECLARE @STUDENTID INT, @ATTCODE VARCHAR(2), @ATTDATE DATE
DECLARE CRS CURSOR LOCAL FAST_FORWARD FOR
SELECT TEST1.STUDENTID,TEST1.ATTCODE,TEST1.ATTDATE
FROM TEST1
LEFT JOIN TEST2 ON TEST1.STUDENTID=TEST2.STUDENTID AND TEST1.ATTCODE=TEST2.ATTCODES AND TEST1.ATTDATE=TEST2.FROMDATE
WHERE TEST2.STUDENTID IS NULL
ORDER BY 1,3 ASC
OPEN CRS
FETCH NEXT FROM CRS INTO @STUDENTID, @ATTCODE, @ATTDATE
WHILE @@FETCH_STATUS=0
BEGIN
IF EXISTS
(
SELECT 1
FROM TEST2
WHERE STUDENTID=@STUDENTID AND DATEADD(DD,1,TODATE)=@ATTDATE
)
UPDATE TEST2
SET TODATE=@ATTDATE, ATTCODES+=','+@ATTCODE, CONSECUTIVEABS+=1
WHERE STUDENTID=@STUDENTID AND DATEADD(DD,1,TODATE)=@ATTDATE
ELSE
INSERT INTO TEST2
SELECT @STUDENTID,@ATTDATE,@ATTDATE,1,@ATTCODE
FETCH NEXT FROM CRS INTO @STUDENTID, @ATTCODE, @ATTDATE
END
SELECT * FROM TEST2
ORDER BY 1,2
One case it doesn't deal with is when you have the same studenId and attdate and different attcode in the input table. You haven't mentioned anything about this case that's why it is not dealt by the code above.