The basic idea would be something like,
CREATE TABLE #test_table (COL_ONE varchar(30), COL_TWO varchar(30), COL_THREE int)
INSERT INTO #test_table
SELECT 'test1', 'c', 1
UNION
SELECT 'test1', 'b', 500
UNION
SELECT 'test2', 'a', 2
DECLARE @sql varchar(max),
@col_three int
DECLARE temp_con CURSOR FOR SELECT DISTINCT COL_THREE FROM #test_table ORDER BY COL_THREE ASC
OPEN TEMP_CON
SET @sql = 'SELECT COL_ONE, COL_TWO '
FETCH NEXT FROM temp_con INTO @col_three
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = @sql + ', CASE WHEN COL_THREE = ' + CAST(@col_three AS varchar) + ' THEN 1 ELSE NULL END AS Hist_' + CAST(@col_three AS varchar)
FETCH NEXT FROM temp_con INTO @col_three
END
CLOSE temp_con
DEALLOCATE temp_con
SET @sql = @sql + ' FROM #test_table'
EXEC (@sql)
DROP TABLE #test_table