MySQL如何分组并从多行中选择某些文本?

时间:2014-11-14 20:00:32

标签: 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');

需要一份报告,包括每位持卡人一行,所有卡上的总余额,以及按照以下确切顺序排列的最少限制状态:1。有效,2。已过期,3。有限,4。已锁定。

持卡人#1有一张活跃的卡片,而一张卡片已经过期了,报告应该显示为“活跃的”#。 持卡人#2的卡片数量有限,且卡片已被锁定,报告应显示为“限制”。

查询

select customer, sum(balance), '?'
from card
group by customer

查询如何显示持卡人卡的限制最少的状态?

3 个答案:

答案 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

这是因为按字母顺序,用户限制最少的卡状态按字母顺序排列为最小值。注意,其他答案提供了更好的长期可持续解决方案,而我的只是基于此示例中所示数据结构的解决方案。