Агрегирование данных с помощью SQL, если другие значения в строках соответствуют определенным критериям - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в SQL и пытаюсь выяснить, есть ли способ объединить дату в новый столбец. Например, ниже приведен образец даты. Я хочу взять весь тип «2» и создать новые столбцы

Mem   Balance  Type  New
 1     2500     2    0
 2     722      66   1
 3     9422      1   0
 4     122       2   1
 5     788      66   1

Поэтому вместо того, чтобы иметь его, как указано выше, это будет похоже на

Mem   Type2Balance  Type66Balance   Type2New    Type66New
1       2622            0            1             0
2         0            1510          0             2

Есть способ сделать это в SQL? Я подумал, может быть, использовать операторы IF в операторе case? Я не прошу, чтобы это было сделано за меня, я больше ищу подробностей, о которых я могу прочитать, чтобы это произошло. Спасибо!

Ответы [ 2 ]

1 голос
/ 06 мая 2020

С условным агрегированием:

select min(mem) mem,
  sum(case when type = 2 then balance else 0 end) Type2Balance,
  sum(case when type = 66 then balance else 0 end) Type66Balance,
  sum(case when type = 2 then new else 0 end) Type2New,
  sum(case when type = 66 then new else 0 end) Type66New
from tablename
where type in (2, 66)
group by type

См. демонстрацию . Результатов:

| mem | Type2Balance | Type66Balance | Type2New | Type66New |
| --- | ------------ | ------------- | -------- | --------- |
| 1   | 2622         | 0             | 1        | 0         |
| 2   | 0            | 1510          | 0        | 2         |
1 голос
/ 06 мая 2020

Похоже, вы хотите:

select
    case when type = 2 then sum(balance) else 0 end type2balance,
    case when type = 66 then sum(balance) else 0 end type66balance,
    case when type = 2 then sum(new) else 0 end type2new,
    case when type = 66 then sum(new) else 0 end type66new
from mytable
where type in (2, 66)
group by type

Я не уверен, какой logi c вы хотите для столбца Mem в результирующем наборе. Это просто номер строки, тогда:

select
    row_number() over(order by type) mem,
    case when type = 2 then sum(balance) else 0 end type2balance,
    case when type = 66 then sum(balance) else 0 end type66balance,
    case when type = 2 then sum(new) else 0 end type2new,
    case when type = 66 then sum(new) else 0 end type66new
from mytable
where type in (2, 66)
group by type

Мы могли бы поместить условное выражение на type внутри агрегатной функции, но это не имеет смысла, поскольку вы уже группируете по type. В этом случае это будет:

select
    row_number() over(order by type) mem,
    sum(case when type = 2 then balance else 0 end) type2balance,
    sum(case when type = 66 then balance else 0 end) type66balance,
    sum(case when type = 2 then new else 0 end) type2new,
    sum(case when type = 66 then new else 0 end) type66new
from mytable
where type in (2, 66)
group by type
...