Попробуйте ип-поворот, а затем условно подсчета строк.
Что-то вроде этого:
SELECT ABC,
Sum(CASE
WHEN VALS = 'n' THEN 1
ELSE 0
END) n,
Sum(CASE
WHEN VALS = 'e' THEN 1
ELSE 0
END) E,
Sum(CASE
WHEN LEFT(VALS, 1) = '-' THEN 1
ELSE 0
END) NegativeValues
FROM TABLE1
UNPIVOT (VALS
FOR ABC IN ([A],
[B],
[C],
[D]))t
GROUP BY ABC
Посмотрите на рабочий пример на SQL Fiddle.
Удачи!
Принимая во внимание, что «п» значение фактически NULL и функция UNPIVOT
падает NULL значения, и что «е» значение на самом деле «-1e», вот обновленная версия запроса:
SELECT ABC,
Sum(CASE
WHEN VALS = 'NULL' THEN 1
ELSE 0
END) n,
Sum(CASE
WHEN VALS = '-1e' THEN 1
ELSE 0
END) E,
Sum(CASE
WHEN LEFT(VALS, 1) = '-'
AND Charindex('e', VALS) = 0 THEN 1
ELSE 0
END) NegativeValues
FROM (SELECT Isnull(A, 'NULL')A,
Isnull(B, 'NULL')B,
Isnull(C, 'NULL')C,
Isnull(D, 'NULL')D
FROM TABLE1)T
UNPIVOT (VALS
FOR ABC IN ([A],
[B],
[C],
[D]))t
GROUP BY ABC
А вот обновленная ссылка на SQL Fiddle.
Редактировать С новой информации, что -1e на самом деле являются научные числа и что все поля являются типами с плавающей точкой, вот мое решение обновляется (надеюсь окончательный):
SELECT ABC,
Sum(CASE
WHEN VALS = 'NULL' THEN 1
ELSE 0
END) n,
Sum(CASE
WHEN VALS LIKE '-1e+070%' THEN 1
ELSE 0
END) E,
Sum(CASE
WHEN LEFT(VALS, 1) = '-'
AND Charindex('e', VALS) = 0 THEN 1
ELSE 0
END) NegativeValues
FROM (SELECT Isnull(Cast(A AS VARCHAR(10)), 'NULL')A,
Isnull(Cast(B AS VARCHAR(10)), 'NULL')B,
Isnull(Cast(C AS VARCHAR(10)), 'NULL')C,
Isnull(Cast(D AS VARCHAR(10)), 'NULL')D
FROM TABLE1)T
UNPIVOT (VALS
FOR ABC IN ([A],
[B],
[C],
[D]))t
GROUP BY ABC
И курс новой ссылки на SQL Fiddle.
Какой сервер вы используете MS SQL-Server или Oracle? –
Привет, Игорь, я использую SQL Server 2012 – Reyaz
@Reyaz: Что вы пробовали? –