У меня есть два предложения (в зависимости от того, какие данные вы хотите)
Первые тестовые данные:
DECLARE @tbl TABLE(Signal VARCHAR(100),State VARCHAR(100),Time DATETIME)
INSERT INTO @tbl
SELECT 'Alarm1','Disabled','2011-11-15 09:00'
UNION ALL
SELECT 'Alarm1','Enabled','2011-12-20 13:30'
UNION ALL
SELECT 'Alarm2','Enabled','2011-11-17 15:01'
UNION ALL
SELECT 'Alarm2','Disabled','2011-12-15 06:57'
UNION ALL
SELECT 'Alarm3','Disabled','2011-11-10 11:42'
UNION ALL
SELECT 'Alarm3','Enabled','2011-12-02 13:12'
UNION ALL
SELECT 'Alarm3','Disabled','2011-12-24 14:41'
UNION ALL
SELECT 'Alarm4','Enabled','2011-10-09 13:25'
UNION ALL
SELECT 'Alarm4','Disabled','2012-01-07 08:29'
UNION ALL
SELECT 'Alarm5','Disabled','2011-11-19 07:12'
UNION ALL
SELECT 'Alarm5','Enabled','2011-11-28 15:48'
UNION ALL
SELECT 'Alarm6','Disabled','2011-12-14 17:29'
UNION ALL
SELECT 'Alarm6','Enabled','2011-12-23 23:46'
DECLARE @startDate DATETIME='2011-12-01'
Тогда, если вы, что тревога не уникальная. Я бы сделал что-то вроде этого:
SELECT
tbl.Signal,
CASE
WHEN tbl.State='Disabled'
THEN convert(varchar, tbl.Time, 120)
ELSE '-'
END AS DisabledTime,
CASE
WHEN tbl.State='Enabled'
THEN convert(varchar, tbl.Time, 120)
ELSE '-'
END AS EnabledTime
FROM
@tbl AS tbl
WHERE
tbl.Time BETWEEN @startDate AND (DATEADD(MM,1,@startDate)-1)
Если вы знаете, какие тревоги уникальны, я бы сделал что-то вроде этого:
SELECT
pvt.Signal,
ISNULL(pvt.Disabled,'-') AS Disabled,
ISNULL(pvt.Enabled,'-') AS Enabled
FROM
(
SELECT
tbl.Signal,
convert(varchar, tbl.Time, 120) AS Time,
tbl.State
FROM
@tbl AS tbl
WHERE
tbl.Time BETWEEN @startDate AND (DATEADD(MM,1,@startDate)-1)
) AS p
PIVOT
(
MAX(p.Time)
FOR p.State IN([Disabled],[Enabled])
) AS pvt