Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Разделить таблицу на положительные и отрицательные


Автор: neosapient 1.7.2010, 16:55
Здравствуйте, помогите новичку составить верный запрос.

Есть таблица с полями:
 - ID, идентификатор операции
 - USER, пользователь
 - MONEY, денежная операция (может быть положительной и отрицательной

ID  USER  MONEY
1        1        +10
2        1         -20
3        2        +60
4        1        +40


Требуется разбить столбец MONEY на положительные и отрицательные значения, затем сгрупировать выборки по USER  и просуммировать их.


USER   POS   NEG
1           50      20
2           60        0

То есть первая и четвертая строка исходной таблицы сложилась в число 50 и их сумма попала к первому пользователю в положительный столбец.
Для значения второй строки исходной таблицы был отброшен знак и число попало к первому пользователю в отрицательный столбец.
Значение третей строки исходной таблицы попало к второму пользователю в положительный столбец.
А в отрицательный столбец к второму пользователю попал 0, так как в исходных данных не было соответствующих значений

Автор: Akina 1.7.2010, 17:43
Использовать CASE, IIF или что там есть в конкретном языке для отбора.

Автор: Gluttton 1.7.2010, 18:09
Код

select
    s.usr,
    sum(s.pos) as pos,
    sum(s.neg)*(-1) as neg
from
(
    select
        t.usr,
        case
            when t.money>0
            then t.money
            else 0
        end as pos,
        case
            when t.money<0
            then t.money
            else 0
        end as neg
    from t
)   as s
    group by s.usr


Добавлено через 10 минут и 18 секунд
Или так:
Код

select
    s.usr,
    case
        when s.pos is null
        then 0
        else s.pos
    end as pos,
    case
        when s.neg is null
        then 0
        else s.neg
    end as neg
from
(
    select distinct
        t.usr,
        (
            select sum(a.money)
            from t as a
                where a.usr = t.usr
                and a.money > 0
        )   as pos,
        (
            select sum(b.money)*(-1)
            from t as b
                where b.usr = t.usr
                and b.money < 0
        )   as neg
    from t
)   as s

Автор: neosapient 2.7.2010, 14:55
Спасибо за ответ.
Помогло,  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)