信用卡公司向每位消费者发放了几张信用卡。
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');
需要一份报告,包括每位持卡人一行,所有卡上的总余额,以及按照以下确切顺序排列的最少限制状态:1。有效,2。已过期,3。有限,4。已锁定。
持卡人#1有一张活跃的卡片,而一张卡片已经过期了,报告应该显示为“活跃的”#。 持卡人#2的卡片数量有限,且卡片已被锁定,报告应显示为“限制”。
查询
select customer, sum(balance), '?'
from card
group by customer
查询如何显示持卡人卡的限制最少的状态?
答案 0 :(得分:2)
你应该为" status"创建一个单独的表。的卡。所以你可以创建一个简单的" CASE WHEN"在SQL中阻止处理所有这些。
示例:
CREATE TABLE card_status (
status_id int PRIMARY KEY,
message varchar(255)
);
INSERT INTO card_status VALUES (1, 'active');
INSERT INTO card_status VALUES (2, 'expired');
...
最后,SQL:
SELECT customer, sum(balance), MIN(status)
FROM card
GROUP BY customer
现在你可以根据状态(Sub-Select,CASE WHEN ...)
进行过滤答案 1 :(得分:0)
通过将状态更改为整数并将外键关系插入状态表来规范化表,然后您可以在选择查询中选择min(status)
答案 2 :(得分:0)
在这个问题中,您可以幸运地得到以下查询的答案:
select customer, sum(balance) balance, MIN(status) leastRestrictedStatus
from card
group by customer
这是因为按字母顺序,用户限制最少的卡状态按字母顺序排列为最小值。注意,其他答案提供了更好的长期可持续解决方案,而我的只是基于此示例中所示数据结构的解决方案。