У меня есть набор данных, который выглядит так:
id No_trans Bank
1 2 VISA
1 1 PAYPAL
2 3 MASTERCARD
3 1 MASTERCARD
3 4 PAYPAL
4 1 PAYPAL
Мне нужно сделать, если id
имеет PAYPAL
, например, изменить его на другой банк. Для id
= 1 PAYPAL
должен быть как VISA
, но для id
= 3 он должен быть MASTERCARD
, однако для id
= 4 он должен быть PAYPAL
потому что у него нет другой Bank
записи.
select id ,count(No_trans) ,
case Bank when PAYPAL then VISA
when PAYPAL then MASTERCARD
else
PAYPAL
end as bank
from table
Группирование по 1 и 3 не будет работать, потому что мне нужно изменить его, в зависимости от того, какая другая запись имеет тот же самый банк id
.
Если этот идентификатор имеет банк, отличный от PAYPAL
, используйте его для других записей с тем же идентификатором, если нет, используйте его как есть.
create temporary table t1
(
ID INT
, no_trans int
, bank varchar (255)
);
INSERT INTO t1 values
(1, 2 , 'VISA'),
(1 , 1 , 'PAYPAL'),
(2, 3 , 'MASTERCARD'),
(3 , 1 , 'MASTERCARD'),
(3, 4 , 'PAYPAL'),
(4 , 1 , 'PAYPAL');
select * from t1
where id = 1
вернуть
'1','2','VISA'
'1','1','PAYPAL'
я нуждаюсь
'1','2','VISA'
'1','1','VISA'
за
выберите * из t1, где id = 3 должен быть
ID, no_trans, bank
3, 1, MASTERCARD
3, 4, MASTERCARD
за
выберите * из t1, где id = 4
ID, no_trans, bank
4, 1, PAYPAL
Вы можете использовать агрегацию:
select id,
coalesce(max(case when Bank <> 'PayPal' then Bank end),
max(Bank)
)
from t
group by id;
Если вы хотите исходные строки, то, возможно, подзапрос проще:
select t.*,
(select t2.bank
from t t2
where t2.id = t.id
order by (t2.bank <> 'PayPal) desc
limit 1
) as new_bank
from t;
Попробуйте следующее:
select
ID,
no_trans,
If (id = 1 and bank = 'PAYPAL', 'VISA',bank)as bank
from t1
where id = 1
Для Id = 3
select
ID,
no_trans,
If (id = 3 and bank = 'PAYPAL', 'MATERCARD',bank) as bank
from t1
where id = 3;
Если вам нужны все из них:
select
ID,
no_trans,
If (bank = 'PAYPAL',If(id = 1,'VISA',If(id=3,'MASTERCARD',bank)),bank) as bank
from t1;