Дело с несколькими записями

0

У меня есть набор данных, который выглядит так:

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
  • 0
    Комбинация может быть только в виде визы, мастер-карты, PayPal или Visa и PayPal или MasterCard и PayPal, один идентификатор имеет много записей, но только в качестве банка. Виза или PayPal, или MasterCard или PayPal, это не может. быть визой и мастер-картой под одним и тем же идентификатором
  • 0
    Можете ли вы изготовить таблицу желаемого результата? Это очень помогло бы. Это будет сложно и ненадежно с текущими данными, которые у вас есть.
Показать ещё 1 комментарий
Теги:
case

2 ответа

1
Лучший ответ

Вы можете использовать агрегацию:

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;
1

Попробуйте следующее:

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;

SQLFIDDLE DEMO

Ещё вопросы

Сообщество Overcoder
Наверх
Меню