2016-07-06 2 views
-2

table1Как отделить сумму() положительных и отрицательных чисел в другие ряды

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

Ответ

negative : 
positive : 

EDIT:

Это специальное условие не использовать union.

+0

Вы должны взглянуть на ке yword 'HAVING'. – tobi6

+1

Каковы значения, которые вы ожидаете увидеть в своем выходе, на основе ваших входных данных? Вы суммируете все отрицательные значения независимо от того, находятся ли они в столбце a или b, или суммируете ли вы для каждого столбца отдельно? – Boneist

+0

Пожалуйста, объясните свое «особое состояние». – onedaywhen

ответ

2

Вы могли бы сделать это в CASE завернутые в SUM

Test Data

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 

I ж вам это нужно в два ряда, попробуйте этот

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 

Ok, без UNION вы можете использовать UNPIVOT как это

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 Я предоставил ответ, который использует univot, а не union. Попробуй. –

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 
Смежные вопросы