MySQL如何分组并从多行中选择特定状态?

MySQL如何分组并从多行中选择特定状态?,mysql,sql,group-by,Mysql,Sql,Group By,一家信用卡公司向每个消费者发放了几张信用卡 CREATE TABLE card ( cardnumber int PRIMARY KEY, customer int, balance decimal(9,2), status varchar(10) ); INSERT INTO card VALUES ('100', '1', 100.00, 'active'); INSERT INTO card VALUES ('10

一家信用卡公司向每个消费者发放了几张信用卡

CREATE TABLE card (
  cardnumber int PRIMARY KEY,
  customer int,
  balance decimal(9,2),               
  status varchar(10)              
);

INSERT INTO card VALUES ('100', '1', 100.00, 'active');
INSERT INTO card VALUES ('101', '1', 100.00, 'expired');
INSERT INTO card VALUES ('102', '2', 100.00, 'limited');
INSERT INTO card VALUES ('103', '2', 100.00, 'locked');
INSERT INTO card VALUES ('104', '3', 100.00, 'lost');
INSERT INTO card VALUES ('105', '3', 100.00, 'closed');
需要一份报告,包括每个持卡人一行、所有卡上的总余额以及严格顺序为:1的最低限制状态。主动,2。过期,3。有限公司,4。锁定,5。迷路了,6。关闭

持卡人1有一张卡处于“活动”状态,一张卡处于“过期”状态,报告应显示“活动”。 持卡人2有一张卡在“有限”位置,一张卡在“锁定”位置,报告应显示“有限”。 持卡人3有一张卡处于“丢失”状态,一张卡处于“关闭”状态,报告应显示“丢失”

如果有另一个状态表,似乎会有所帮助

create table status (
  status varchar(15) primary key,
  restriction int
);

insert into status values ('active', 1);
insert into status values ('expired', 2);
insert into status values ('limited', 3);
insert into status values ('locked', 4);
insert into status values ('lost', 5);
insert into status values ('closed', 6);
查询如何仅显示持卡人卡的最低限制状态

select c.customer, sum(c.balance), 'status?'
from card c
join status s on s.status=c.status?
group by c.customer

PS表1“卡”无法更改。

为每个客户创建一个包含最小限制的派生表,然后将最小限制加入状态表

select t1.*, s.status from (
    select c.customer, sum(c.balance), min(restriction) min_restriction
    from card c
    join status s on s.status=c.status
    group by c.customer
) t1 join status s on t1.min_restriction = s.restriction

即使不创建第二个表,也可以生成报告

select customer,sum(balance), min(restriction),case when min(restriction)=1 then 'active' when min(restriction)=2 then 'expired' when min(restriction)=3 then 'limited' when min(restriction)=4 then 'locked' else 'lost' end stat from ( select cardnumber,customer,balance,status,case when status='active' then 1 when status='expired' then 2 when status='limited' then 3 when status='locked' then 4 when status='lost' then 5 else 6 end restriction from card ) c group by customer
MySQL在RDMS标准之外有一些优势。

提示:限制最少的是状态表中的最小限制。