Необходимо получить выходные данные в виде положительных и отрицательных чисел из одного столбца в разные столбцы из одной таблицы

Мне нужно решение для сценария ниже:

TABLE A:
col1
1
-1
6
-5
2
4
-2
5

Я хочу ВЫХОД как:

POSITIVE     NEGATIVE
1            -1
2            -2
4            NULL
5            -5
6            NULL

3 ответа

Решение

Вы можете попробовать что-то вроде:

SELECT t1.col1 AS POSITIVE, t2.col1 AS NEGATIVE
FROM (
   SELECT col1
   from tableA
   WHERE col1 > 0 ) t1
FULL OUTER JOIN (
   SELECT col1
   FROM tableA
   WHERE col1 < 0 ) t2 ON t1.col1 = ABS(t2.col1)
ORDER BY ABS(COALESCE(t1.col1, t2.col1))

SQL Fiddle Demo

Этот коррелированный подзапрос делает то, что вы хотите, используя ABS:

SELECT POSITIVE = a1.col1,
       NEGATIVE = (SELECT TOP 1 a2.col1
                   FROM TableA a2
                   WHERE a2.col1 < 0 
                   AND   ABS(a2.col1) = a1.col1)
FROM TableA a1
WHERE a1.col1 >= 0 
ORDER BY a1.Col1

Sql-Fiddle

Мне легче читать как FULL OUTER сам JOIN,

select A.Col1 as POSITIVE,
       B.Col1 as NEGATIVE
FROM A
FULL JOIN A as B on (-A.col1=B.Col1)
WHERE A.Col1>0 or B.Col1 < 0
ORDER BY ISNULL(A.Col1,-B.Col1)

SQLFiddle demo

Если ПОЗИТИВНЫЕ значения всегда существуют для каждого ОТРИЦАТЕЛЬНОГО в таблице, тогда используйте LEFT JOIN вместо FULL:

select A.Col1 as POSITIVE,
       B.Col1 as NEGATIVE
FROM A
LEFT JOIN A as B on (-A.col1=B.Col1)
WHERE A.Col1>0 
ORDER BY A.Col1
Другие вопросы по тегам