MySQL如何从多行中分组并选择某些状态?

标签 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 ('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

http://sqlfiddle.com/#!2/8d680/2

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

http://sqlfiddle.com/#!2/8d680/3

关于MySQL如何从多行中分组并选择某些状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942454/

相关文章:

mysql - HELP C 中的 TCP 服务器无法保存在 MYSQL 中!

php - 如何在php中获取单个列前面的所有数据

sql - 为什么 Oracle 的序列在尝试重新创建序列时会跳过它们的缓存值?

sql - 选择正确的数据库 : MySQL vs. 其他一切

Mysql 查询没有给出 group by 的预期结果

php - 需要一些解决方案来解决我的 mysql 表在 2 个条件下的结果

mysql - MySQL 表的命名约定

mysql COUNT 中的子查询以及 GROUP BY YEAR

python - Pandas 按列分组并转换为键 :value pair

php - 将 html 日期和时间转换为我的数据库日期时间列