【问题标题】:Counting distinct number of items returned by Joining tables计算联接表返回的不同项目数
【发布时间】:2015-12-19 19:32:07
【问题描述】:

我有 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)

【问题讨论】:

    标签: sql sqlite join


    【解决方案1】:

    为什么要为一个用户提供多行?另外,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;
    

    如果您真的喜欢,您可以将其加入到更详细的信息中,以添加每次付款的列。

    【讨论】:

    • noBothCashCheck 的总和
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多