PIVOTまたはを使用してそのような結果を取得できます。列GROUP BYに変数値がある場合でも結果を取得できます。Type
テストデータ:
CREATE TABLE #t(ID    INT, Type VARCHAR(100))
INSERT #t 
VALUES 
(1,     'sent'),
(1,     'sent'),
(1,     'open'),
(1,     'bounce'),
(1,     'click'),
(2,     'sent'),
(2,     'sent'),
(2,     'open'),
(2,     'open'),
(2,     'click')
PIVOTアプローチ:
SELECT  pvt.*
FROM    #t
PIVOT
(
    COUNT(Type) FOR Type IN ([sent], [open], [bounce], [click])
) pvt
に他の可能な値がTypeあり、それらを事前に知らない場合は、 dynamic を使用しますPIVOT。
DECLARE @cols NVARCHAR(1000) = STUFF(
(
    SELECT  DISTINCT ',[' + Type + ']'
    FROM    #t
    FOR     XML PATH('')
), 1, 1, '')
DECLARE @query NVARCHAR(2000) = 
'
SELECT  pvt.*
FROM    #t
PIVOT
(
    COUNT(Type) FOR Type IN ('+@cols+')
) pvt   
'
EXEC(@query)
の固定値がわかっている場合はType、次も使用できます。
SELECT  ID,
        COUNT(CASE WHEN Type = 'sent' THEN 1 END) [sent],
        COUNT(CASE WHEN Type = 'open' THEN 1 END) [open],
        COUNT(CASE WHEN Type = 'bounce' THEN 1 END) bounce,
        COUNT(CASE WHEN Type = 'click' THEN 1 END) click
FROM    #t
GROUP   BY ID