2015-12-19 51 views
0

我有3個表,User, Payment, Type Of Payment 像:計數通過連接表返回的項目不同數量

CREATE TABLE User (
    `userID` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `userName` varchar(4) 
); 
INSERT INTO User values  
    (1, 'Tom'), 
    (2, 'Kate'), 
    (3, 'Karla'); 

CREATE TABLE typePayment ( 
    typeID INTEGER PRIMARY KEY AUTOINCREMENT, 
    namePayment  VARCHAR(6) NOT NULL 
); 
INSERT INTO typePayment values 
(1,'Cash'), 
(2,'Check'), 
(3,'Both'); 

CREATE TABLE Payment (
    `paymentID` INTEGER PRIMARY KEY AUTOINCREMENT, 
    `idUser` int, 
    `idTypePayment` int, 
    `info` varchar(14) 
); 

INSERT INTO Payment VALUES 
    (1, 1, 1, 'ball'), 
    (2, 1, 1, 'book'), 
    (3, 1, 2, 'book'), 
    (4, 2, 1, 'book'); 

當聯接表進行磋商,以人支付的款項我

userID userName namePayment  info 
1  Tom   Cash   ball 
1  Tom   Cash   book 
1  Tom   Check   book 
2  Kate  Cash   book 

通過以下查詢

SELECT u.userID ,u.userName, te.namePayment , e.info 
FROM User u 
    INNER JOIN Payment e 
    ON u.userID = e.idUser  
    INNER JOIN typePayment te 
    ON e.idTypePayment = te.typeID 
order by u.userID; 

但是我想要數一下總式支付做喜歡每個人:

userID userName namePayment  info noCash noCheck noBoth 
1  Tom   Cash   ball  2   1  0 
1  Tom   Cash   book  2   1  0 
1  Tom   Check   book  2   1  0 
2  Kate  Cash   book  1   0  0 

怎麼辦呢? (請看看fiddle,我正在使用SQLite)

+0

什麼是'noBoth'? –

回答

3

爲什麼要爲用戶多行?另外,noBoth沒有意義。

此查詢獲取不同類型的每用戶付費:

SELECT u.userID, u.userName, 
     SUM(CASE WHEN te.namePayment = 'Cash' THEN 1 ELSE 0 END) as NumCash,   
     SUM(CASE WHEN te.namePayment = 'Check' THEN 1 ELSE 0 END) as NumCheck, 
     SUM(CASE WHEN te.namePayment IN ('Cash', 'Check') THEN 1 ELSE 0 END) as NumBoth 
FROM User u INNER JOIN 
    Payment e 
    ON u.userID = e.idUser INNER JOIN 
    typePayment te 
    ON e.idTypePayment = te.typeID 
GROUP BY u.userID; 
ORDER BY u.userID; 

如果你真的很喜歡,你可以加入此回更詳細的信息,每次支付添加列。

+0

'noBoth'是「Cash」和「Check」的總和 – cMinor