1

私はユーザーテーブルを持っています:

USERテーブル

╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║  1 ║ A    ║
║  2 ║ B    ║
║  3 ║ C    ║
╚════╩══════╝

支払いテーブル

╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║  1 ║       1 ║   2000 ║
║  2 ║       1 ║   1000 ║
║  3 ║       1 ║   1000 ║
║  4 ║       2 ║   1000 ║
╚════╩═════════╩════════╝

PRODUCTテーブル

╔════╦═════════╦════════╗
║ ID ║ USER_ID ║ AMOUNT ║
╠════╬═════════╬════════╣
║  1 ║       1 ║   1000 ║
║  2 ║       1 ║   1000 ║
║  3 ║       1 ║   1000 ║
║  4 ║       2 ║    500 ║
║  5 ║       2 ║    500 ║
║  6 ║       3 ║   1000 ║
╚════╩═════════╩════════╝

今、私はそのような結果を得たいです:

╔════╦══════╦═════════════════╗
║ ID ║ NAME ║     BALANCE     ║
╠════╬══════╬═════════════════╣
║  1 ║ A    ║ +1000 (or 1000) ║
║  2 ║ B    ║ 0               ║
║  3 ║ C    ║ -1000           ║
╚════╩══════╩═════════════════╝
4

2 に答える 2

1

テーブルには他のテーブルに複数の一致があるレコードがあり、一致しないレコードがあるため、テーブルを直接結合することはできませんusers。これにより、無効な結果が発生します。私が考えることができる最善の方法は、異なるテーブルの各ユーザーの合計を計算し、その結果をテーブルに結合することuserです。

SELECT  a.*,
        COALESCE(b.totalPayed,0) - COALESCE(c.total,0) balance
FROM    user a
        LEFT JOIN
        (
            SELECT  user_ID, SUM(amount) totalPayed
            FROM    payment
            GROUP   BY user_ID
        ) b ON a.ID = b.user_ID
        LEFT JOIN 
        (
            SELECT  user_ID, SUM(amount) total
            FROM    product
            GROUP   BY user_ID
        ) c ON a.ID = c.user_ID

出力

╔════╦══════╦═════════╗
║ ID ║ NAME ║ BALANCE ║
╠════╬══════╬═════════╣
║  1 ║ A    ║    1000 ║
║  2 ║ B    ║       0 ║
║  3 ║ C    ║   -1000 ║
╚════╩══════╩═════════╝

結合についてさらに知識を深めるには、以下のリンクにアクセスしてください。

于 2013-03-16T16:26:26.197 に答える
1
 DROP TABLE  IF EXISTS user;
 CREATE TABLE user
 (user_id INT NOT NULL PRIMARY KEY,name CHAR(1) NOT NULL);

 INSERT INTO user VALUES (1 ,'A'),(2,'B'),(3,'C');

 DROP TABLE IF EXISTS payment;
 CREATE TABLE payment
 (payment_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,user_id INT NOT NULL
 ,amount INT NOT NULL
 );

 INSERT INTO payment VALUES
 (1 ,1 ,2000),
 (2 ,1 ,1000),
 (3 ,1 ,1000),
 (4 ,2 ,1000 );

 DROP TABLE IF EXISTS product;

 CREATE TABLE product
 (product_id INT NOT NULL PRIMARY KEY
 ,user_id INT NOT NULL
 ,amount INT NOT NULL
 );

 INSERT INTO product VALUES
 (1 ,1 ,1000 ),
 (2,1 ,1000 ),
 (3,1 ,1000),
 (4,2 ,500 ),
 (5,2 ,500 ),
 (6,3 ,1000);

 SELECT x.*
      , SUM(y.amount) ttl 
   FROM user x 
   JOIN 
      ( SELECT user_id
             , amount 
          FROM payment 
     UNION ALL 
        SELECT user_id
             , amount*-1 
          FROM product
      ) y 
     ON y.user_id = x.user_id 
  GROUP 
     BY user_id;
 +---------+------+-------+
 | user_id | name | ttl   |
 +---------+------+-------+
 |       1 | A    |  1000 |
 |       2 | B    |     0 |
 |       3 | C    | -1000 |
 +---------+------+-------+
于 2013-03-16T17:17:14.383 に答える