2016-02-05 2 views
0

У меня есть сценарий, который извлекает транзакции и их данные из базы данных. Но мои пользователи жалуются, что размер создаваемого файла слишком велик, и поэтому они попросили, чтобы определенные транзакции просто подытоживались/консолидировались, если они имеют определенную классификацию, например «Проверка учетных записей». Это означает, что в результирующем наборе с именем «Проверка» должна быть только одна строка, содержащая сумму всех транзакций в разделе «Проверка учетных записей». Есть ли способ для SQL скрипт идти как:использовать SUM при определенных условиях

CASE 
    WHEN Acct_class = 'Checking' 
     then sum(tran_amount) 
    ELSE tran_amount 
END 

У меня уже есть соответствующие GROUP BY и ORDER BY заявления, но я не могу показаться, чтобы получить нужный мне выход. В результирующем наборе есть еще несколько строк «Проверка». Любые идеи были бы очень оценены.

+1

Столбец не может быть аргументом для агрегатной функции только иногда. (Либо всегда, либо никогда.) Можете ли вы дать нам некоторые данные таблицы образцов и ожидаемый результат? – jarlh

ответ

0

Попробуйте это,

Select sum(tran_amount) From tran_amount Where Acct_class = 'Checking' 
+0

Я считаю, что OP необходимо извлечь все строки (агрегирование или нет), а не только те из определенного класса – Aleksej

+0

да, все строки, все детали. Однако для проверки учетных записей я скрою все детали и просто покажу сумму транзакций. – JamesP

0

Вы можете попробовать добиться этого с помощью UNION ALL

SELECT tran_amount, .... FROM table WHERE NOT Acct_class = 'Checking' 
UNION ALL 
SELECT SUM(tran_amount), .... FROM table WHERE Acct_class = 'Checking' GROUP BY Acct_class, ...; 
+0

попробовал это, скрипт занимает слишком много времени, чтобы закончить. :( – JamesP

0

Вы можете попробовать что-то вроде следующего, сохраняя отдельные строки для некоторых классов, и агрегирование для некоторых других :

with test (id, class, amount) as 
(
select 1, 'a'  , 100 from dual union all 
select 2, 'a'  , 100 from dual union all 
select 3, 'Checking', 100 from dual union all 
select 4, 'Checking', 100 from dual union all 
select 5, 'c'  , 100 from dual union all 
select 6, 'c'  , 100 from dual union all 
select 7, 'c'  , 100 from dual union all 
select 8, 'd'  , 100 from dual 
) 
select sum(amount), class 
from test 
group by case 
       when class = 'Checking' then null /* aggregates elements of class 'b' */ 
       else id /* keeps elements of other classes not aggregated */ 
     end, 
     class 
0

привет вы можете попробовать ниже SQL

select account_class, 
case when account_class = 'saving' then listagg(trans_detail, ',') within group (order by emp_name) -- will give you all details transactions 
       when account_class = 'checking' then to_char(sum(trans_detail)) -- will give you only sum of transactions 
              end as trans_det from emp group by account_class; 
0

Или, если желаемый результат получает либо сумму, либо фактическое значение столбца на основе другого значения столбца, то решение было бы использовать аналитическую функцию, чтобы получить сумму вместе с фактическим значением:

select 
    decode(acct_class, 'Checking', tran_amount_sum, tran_amount) 
    from (
    select 
     sum(tran_amount) over (partition by acct_class) as tran_amount_sum, 
     tran_amount, 
     acct_class 
     from 
     YOUR_TABLE 
) 
Смежные вопросы