有多个记录的案例

时间:2018-06-29 03:36:50

标签: mysql sql case

我有一个看起来像这样的数据集:

id No_trans Bank
1   2       VISA
1   1       PAYPAL
2   3       MASTERCARD
3   1       MASTERCARD
3   4       PAYPAL
4   1       PAYPAL

我需要做的是,例如,idPAYPAL,将其更改为另一家银行。 对于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库的其他记录进行更改。

如果此ID的银行与PAYPAL不同,则将其用于具有相同ID的其他记录,否则请按原样使用它。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;