2014-11-14 59 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 

這是由於這樣的事實,按字母順序,用戶限制最少的卡狀態是按字母順序排列的最小值。請注意,其他答案提供了更好的長期可持續解決方案,我的解決方案僅基於本示例中提供的數據結構。