DECLARE @MyTable TABLE
(
CallTime DATETIME,
CallLength INT,
Channel INT
)
INSERT INTO @MyTable
( CallTime, CallLength, Channel )
VALUES
( '06-26-2014 12:00:00', 22, 1 ),
( '06-26-2014 12:00:05', 15, 2 ),
( '06-26-2014 12:00:10', 20, 3 ),
( '06-26-2014 12:00:15', 10, 4 );
DECLARE @number_of_numbers INT = 100000;
;WITH
a AS (SELECT 1 AS i UNION ALL SELECT 1),
b AS (SELECT 1 AS i FROM a AS x, a AS y),
c AS (SELECT 1 AS i FROM b AS x, b AS y),
d AS (SELECT 1 AS i FROM c AS x, c AS y),
e AS (SELECT 1 AS i FROM d AS x, d AS y),
f AS (SELECT 1 AS i FROM e AS x, e AS y),
numbers AS
(
SELECT TOP(@number_of_numbers)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS number
FROM f
)
SELECT
d.CheckTime,
MAX(CASE WHEN m.Channel = 1 THEN 1 ELSE 0 END) Channel1,
MAX(CASE WHEN m.Channel = 2 THEN 2 ELSE 0 END) Channel2,
MAX(CASE WHEN m.Channel = 3 THEN 3 ELSE 0 END) Channel3,
MAX(CASE WHEN m.Channel = 4 THEN 4 ELSE 0 END) Channel4
FROM
(
SELECT DATEADD(SECOND, n.number, '06/26/2014') CheckTime
FROM numbers n
) AS d
INNER JOIN @MyTable m
ON d.CheckTime >= m.CallTime AND d.CheckTime <= DATEADD(SECOND, m.CallLength, m.CallTime)
GROUP BY d.CheckTime
Here is an example where you create a table of numbers, and then use that to create time slots for each second of the day and then you can join against your table and using group by you can find all of the channels that were active.