2016-10-19 2 views
1

У меня есть требование, когда мне нужно вытащить Max данных, когда> 0 и Min данных, когда < 0. И эта сложная часть должна быть в одной колонке. Пример следующим образом: Ниже запроса:Макс и мин оба в группе BY

SELECT A.employee_id, paycheck_number 
     max (CASE 
      WHEN B.special = 'XXT' THEN B.AMOUNT 
      ELSE 0 
     END) AMOUNT, 
     max (CASE 
      WHEN B.special = 'XXH' THEN B.hrs1 
      ELSE 0 
     END) HRS1 
FROM Table1 A, 
     table2 B 
     LEFT OUTER JOIN table3 C 
        ON B.company = C.company 
WHERE A .employee_id = '123456789' 
GROUP BY A.employee_id, paycheck_number 
ORDER BY 1 

возвратов:

 
EMPLOYEE_ID AMOUNT  HRS1  paycheck_number 
123456789  2799.82 134.84 1234 
123456789  832.86  40  4321 
123456789  0   0  5678 

Если удаляется группа по данные:

 
EMPLOYEE_ID AMOUNT  HRS1  paycheck_number 
123456789  0   134.84 1234 
123456789  2799.82 0  1234 
123456789  0   40  4321 
123456789  832.86  0  4321 
123456789  0   -40  5678 
123456789  -832.86 0  5678 

В то время как я хочу:

 
EMPLOYEE_ID AMOUNT  HRS1  paycheck_number 
123456789  2799.82 134.84 1234 
123456789  832.86  40  4321 
123456789  -832.86 -40  5678 

Это выглядит просто, но whe n Я стараюсь. Это не работает.

+0

Можете ли вы разместить некоторые данные ввода образца. – Teja

+0

@Teja: Входные данные? – Developer

+0

Что у вас есть во всех трех таблицах. – Teja

ответ

1

В Oracle вы получите значение максимального абсолютного количества через KEEP DENSE_RANK FIRST/LAST:

max(value) keep (dense_rank last order by abs(value)) 

Однако, когда всегда есть только один ненулевое значение в одной записи и нули или нули в других записях в рассмотреть, вы можете просто добавить их:

sum(value) 

В вашем случае, когда только одна запись фактически содержит значение, вы создаете ноль записей себя и таким образом получить 0 вместо, скажем, -40, прося максимума стоимость. Удалите ветви ELSE, которые создают мешающие нули, и MAX доставит вам правильное значение. Например:

max(case when b.special = 'XXT' then b.amount end) as amount 
Смежные вопросы