Отредактировано в соответствии с комментариями @HLGM, чтобы сделать его немного более устойчивым.
Обратите внимание, что в его текущей форме я предполагаю, что когда
- все аварийные сигналы равны 1, диапазон должен быть
NULL
- , только один аварийный сигнал равен 0,диапазон - это значение этой тревоги.
Если этого недостаточно, OP может уточнить, что должно быть возвращено.
Оператор SQL
;WITH Alarm (C1, C1Alarm, C2, C2Alarm, C3, C3Alarm, C4, C4Alarm) AS (
SELECT 12.44, 0, 99.43, 0, 4.43, 1, 43.33, 0
UNION ALL SELECT 12.44, 1, 99.43, 0, 4.43, 1, 43.33, 0
UNION ALL SELECT 1, 0, 2, 1, 3, 1, 4, 1
UNION ALL SELECT 1, 1, 2, 1, 3, 1, 4, 1
)
, AddRowNumbers AS (
SELECT rowNumber = ROW_NUMBER() OVER (ORDER BY C1)
, C1, C1Alarm
, C2, C2Alarm
, C3, C3Alarm
, C4, C4Alarm
FROM Alarm
)
, UnPivotColumns AS (
SELECT rowNumber, value = C1 FROM AddRowNumbers WHERE C1Alarm = 0
UNION ALL SELECT rowNumber, C2 FROM AddRowNumbers WHERE C2Alarm = 0
UNION ALL SELECT rowNumber, C3 FROM AddRowNumbers WHERE C3Alarm = 0
UNION ALL SELECT rowNumber, C4 FROM AddRowNumbers WHERE C4Alarm = 0
)
SELECT C1, C1Alarm
, C2, C2Alarm
, C3, C3Alarm
, C4, C4Alarm
, COALESCE(range1.range, range2.range)
FROM AddRowNumbers rowNumber
LEFT OUTER JOIN (SELECT rowNumber, range = MAX(value) - MIN(value) FROM UnPivotColumns GROUP BY rowNumber HAVING COUNT(*) > 1) range1 ON range1.rowNumber = rowNumber.rowNumber
LEFT OUTER JOIN (SELECT rowNumber, range = AVG(value) FROM UnPivotColumns GROUP BY rowNumber HAVING COUNT(*) = 1) range2 ON range2.rowNumber = rowNumber.rowNumber
Тестовый скрипт
;WITH Alarm (C1, C1Alarm, C2, C2Alarm, C3, C3Alarm, C4, C4Alarm) AS (
SELECT 12.44, 0, 99.43, 0, 4.43, 1, 43.33, 0
UNION ALL SELECT 12.44, 1, 99.43, 0, 4.43, 1, 43.33, 0
UNION ALL SELECT 1, 0, 2, 1, 3, 1, 4, 1
UNION ALL SELECT 1, 1, 2, 1, 3, 1, 4, 1
)
, AddRowNumbers AS (
SELECT rowNumber = ROW_NUMBER() OVER (ORDER BY C1)
, C1, C1Alarm
, C2, C2Alarm
, C3, C3Alarm
, C4, C4Alarm
FROM Alarm
)
, UnPivotColumns AS (
SELECT rowNumber, value = C1 FROM AddRowNumbers WHERE C1Alarm = 0
UNION ALL SELECT rowNumber, C2 FROM AddRowNumbers WHERE C2Alarm = 0
UNION ALL SELECT rowNumber, C3 FROM AddRowNumbers WHERE C3Alarm = 0
UNION ALL SELECT rowNumber, C4 FROM AddRowNumbers WHERE C4Alarm = 0
)
SELECT C1, C1Alarm
, C2, C2Alarm
, C3, C3Alarm
, C4, C4Alarm
, COALESCE(range1.range, range2.range)
FROM AddRowNumbers rowNumber
LEFT OUTER JOIN (SELECT rowNumber, range = MAX(value) - MIN(value) FROM UnPivotColumns GROUP BY rowNumber HAVING COUNT(*) > 1) range1 ON range1.rowNumber = rowNumber.rowNumber
LEFT OUTER JOIN (SELECT rowNumber, range = AVG(value) FROM UnPivotColumns GROUP BY rowNumber HAVING COUNT(*) = 1) range2 ON range2.rowNumber = rowNumber.rowNumber