2014-11-14 61 views
0

信用卡公司有几张信用卡发给每个消费者。MySQL如何分组并按多行选择某些文本?

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 

如何才能查询节目只是持卡人卡的限制最少的状态?

回答

2

您应该为卡的“状态”创建一个单独的表。所以你可以在SQL中创建一个简单的“CASE WHEN”块来处理所有这些。

例子:

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 

其中u现在可以通过状态过滤(子选择,CASE WHEN ...)

0

规范化表通过将状态更改为整数并将外键关系插入到状态表中,然后可以在选择查询中选择min(status)

0

在这个问题上,你可以幸运地得到答案下面的查询:

select customer, sum(balance) balance, MIN(status) leastRestrictedStatus 
from card 
group by customer 

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