2015-05-19 78 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