2016-07-06 39 views
-2

表1如何正負數的總和()分離成其他行

------------- 
| a | b | 
------------- 
| -1 | 1 | 
| 5 | 3 | 
| -4 | -4 | 
| 6 | 7 | 
| 9 | -2 | 
------------- 

回答

negative : 
positive : 

編輯:

這是一個特殊的條件下不使用union

+0

你應該看看ke yword'HAVING'。 – tobi6

+1

根據您的輸入數據,您希望在輸出中看到什麼值?你是否總結了所有的負值,無論他們是在列a還是在b,還是你分別爲每列求和? – Boneist

+0

請解釋你的「特殊情況」。 – onedaywhen

回答

2

你可以在CASE包裹在SUM

測試數據

CREATE TABLE #TestData (a int, b int) 
INSERT INTO #TestData (a,b) 
VALUES 
(-1,1) 
,(5,3) 
,(-4,-4) 
,(6,7) 
,(9,-2) 

查詢

SELECT 
SUM((CASE WHEN A > 0 THEN A ELSE 0 END) + (CASE WHEN B > 0 THEN B ELSE 0 END)) Positive 
,SUM((CASE WHEN A < 0 THEN A ELSE 0 END) + (CASE WHEN B < 0 THEN B ELSE 0 END)) Negative 
FROM #TestData 

輸出

Positive Negative 
31   -11 

我這樣做F你需要它在兩行,試試這個

SELECT 
'Positive' DataType 
,SUM((CASE WHEN A > 0 THEN A ELSE 0 END)) A 
,SUM((CASE WHEN B > 0 THEN B ELSE 0 END)) B 
FROM #TestData 
UNION ALL 
SELECT 
'Negative' DataType 
,SUM((CASE WHEN A < 0 THEN A ELSE 0 END)) A 
,SUM((CASE WHEN B < 0 THEN B ELSE 0 END)) B 
FROM #TestData 

結果

DataType A B 
Positive 20 11 
Negative -5 -6 

或者這

SELECT 
'Positive' DataType 
,SUM((CASE WHEN A > 0 THEN A ELSE 0 END) + (CASE WHEN B > 0 THEN B ELSE 0 END)) Result 
FROM #TestData 
UNION ALL 
SELECT 
'Negative' 
,SUM((CASE WHEN A < 0 THEN A ELSE 0 END) + (CASE WHEN B < 0 THEN B ELSE 0 END)) 
FROM #TestData 

結果

DataType Result 
Positive 31 
Negative -11 

好,沒有UNION您可以使用逆透視像這樣

SELECT 
DataType 
,result 
FROM 
(
    SELECT 
    SUM((CASE WHEN A > 0 THEN A ELSE 0 END) + (CASE WHEN B > 0 THEN B ELSE 0 END)) Positive 
    ,SUM((CASE WHEN A < 0 THEN A ELSE 0 END) + (CASE WHEN B < 0 THEN B ELSE 0 END)) Negative 
    FROM #TestData 
) pr 
UNPIVOT 
(
    result 
    for DataType in (Positive, Negative) 
)u 

結果

DataType result 
Positive 31 
Negative -11 
+0

謝謝。但我需要2行: –

+0

@RomanVoitseshevskyi我剛剛更新了我的答案,看看是否可以爲您解決它 –

+0

@RomanVoitseshevskyi我提供了一個答案,使用unpivot而不是聯合。搏一搏。 –

1
with cte as 
(
    select a as ab from tablename 
    union all 
    select b from tablename 
) 
select 'positive', sum(ab) from cte where ab > 0 
union all 
select 'negative', sum(ab) from cte where ab < 0 
+0

無工會請 –

+0

@RomanVoitseshevskyi,爲什麼你不能使用工會? – jarlh

+1

爲什麼沒有工會?如果你提出一個完整的問題,並提出你有任何限制,它會阻止人們提供一個答案,只爲目標職位將被改變這樣的事情。 –

1

可以使用SIGN功能分組:

SELECT CASE WHEN SUM(x) >= 0 THEN 'positive:' ELSE 'negative' END as sign, SUM (x) as result 
    FROM (SELECT * 
      FROM TABLE_NAME UNPIVOT (x FOR y IN (a AS 'a', b AS 'b'))) 
WHERE x <> 0 
GROUP BY SIGN (x) 

而且沒有PIVOT;)

SELECT CASE rn WHEN 1 THEN 'positive:' ELSE 'negative' END SIGN, 
     SUM (CASE SIGN (a)WHEN rn THEN a ELSE 0 END + 
       CASE SIGN (b) WHEN rn THEN b ELSE 0 END) result 
    FROM TABLE_NAME x 
     JOIN ( SELECT ROWNUM - 2 rn 
        FROM DUAL 
       CONNECT BY LEVEL < 4) y 
      ON rn <> 0 
GROUP BY rn