2015-05-19 49 views
3

我需要为下面的场景的解决方案得到一个列到不同的列输出为正数和负数:需要从单一的表

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

我想要的输出:

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

你的结果似乎假定行的排序。 SQL Server中的表(以及所有数据库)表示*无序*集。您需要一个单独的列来指定排序。 –

+0

对于相同的'-ve'值,总是最多只有一个'+ ve'值,反之亦然?如果不是,那应该如何处理? –

+0

什么决定NULL的外观? –

回答

6

您可以尝试类似:

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

+0

0通常被认为是正面的,但否则我同意:) – MatBailie

+0

谢谢@Giorgos Betsos – user3326140

0

此相关子查询你想要做使用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 OUTERJOIN

0
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