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

时间:2014-11-15 04:13:09

标签: 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'卡'无法更改。

2 个答案:

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

答案 1 :(得分:0)

您甚至可以生成报告,而不是创建第二个表


    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 

http://sqlfiddle.com/#!2/898bd/5

MySQL具有RDMS标准的一些优势。