SQL - Как мне суммировать / агрегировать определенные строки в таблице - PullRequest
0 голосов
/ 15 мая 2018

У меня есть таблица t, которая выглядит следующим образом (которая сама по себе является результатом длинного запроса SQL):

    ID     | Name     | Active     | Sales
----------------------------------------------
    1        Amy        t            50
    2        Bill       f            4
    3        Chip       t            127
    4        Dana       t            543
    5        Eve        f            20

Я ищу объединение неактивных пользователей ("Active" = f)так что я получаю результирующую таблицу, подобную этой:

    ID     | Name     | Active     | Sales
----------------------------------------------
    1        Amy        t            50
    3        Chip       t            127
    4        Dana       t            543
    0        -          f            24

Есть ли способ сделать это, не повторяя первоначальный запрос, чтобы получить эту таблицу?

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

использовал другую таблицу с логическим значением для выборки (использовались атрибуты текста kvazi int, boolean и kvazi) ((отличается от вышеупомянутого отсутствием объединения и одним регистром)) (((я использовал sum, как я думал, это то, что вы хотите- агрегировать по регистру))):

t=# select
  case when not rolsuper then '-' else rolname::text end
, rolsuper
, sum(oid::text::int)
from pg_roles
group by case when not rolsuper then '-' else rolname::text end,rolsuper;
 rolname  | rolsuper |  sum
----------+----------+--------
 -        | f        | 144394
 vao      | t        |  16555
 postgres | t        |     10
(3 rows)

, поэтому для вас должно быть что-то вроде:

select
      case when not active then 0 else id end
    , case when not active then '-' else name end
    , active
    , sum(sales)
    from t
    group by 
      case when not active then 0 else id end
    , case when not active then '-' else name end
    , active;
0 голосов
/ 15 мая 2018
SELECT ID
    ,Name
    ,Active
    ,Sales
FROM my TABLE
WHERE Active = 't'

UNION

SELECT 0
    ,''
    ,Active
    ,COUNT(Sales)
FROM my TABLE
WHERE Active = 'f'
GROUP BY Active
0 голосов
/ 15 мая 2018

и вот без союзов:

select IIF(Active = 'f', 0, ID) ID, IIF(Active = 'f', '-', Name) Name, Active, SUM(Sales) Sales
from t
group by IIF(Active = 'f', 0, ID), IIF(Active = 'f', '-', Name), Active
0 голосов
/ 15 мая 2018

Вот простой способ:

select id, name, active, sales
from t
where active
union all
select 0, NULL, f, sum(sales)
from t
where not active;

Если это результат сложного представления, возможно, вы не захотите ссылаться на него дважды.Если это так, вы можете использовать агрегацию:

select (case when active then id end) as id,
       (case when active then name end) as name,
       active,
       sum(sales) as sales
from t
group by (case when active then id end),
         (case when active then name end) as name,
         active;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...