信用卡公司向每位消费者发放了几张信用卡。
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'卡'无法更改。
答案 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
答案 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标准的一些优势。