Mysql 编写查找余额查询

Mysql 编写查找余额查询,mysql,sql,mysql-workbench,writing,Mysql,Sql,Mysql Workbench,Writing,对于客户名为Alexander Felix的每个帐户,计算余额,并返回一个表格,显示每个帐户的帐号、类型和余额(提示:使用UNION)。 DROP DATABASE IF EXISTS Bank; CREATE DATABASE Bank; USE Bank; DROP TABLE IF EXISTS transaction; DROP TABLE IF EXISTS customer; DROP TABLE IF EXISTS account; CREATE TABLE customer

对于客户名为Alexander Felix的每个帐户,计算余额,并返回一个表格,显示每个帐户的帐号、类型和余额(提示:使用UNION)。

DROP DATABASE IF EXISTS Bank;
CREATE DATABASE Bank;
USE Bank;

DROP TABLE IF EXISTS transaction;
DROP TABLE IF EXISTS customer;
DROP TABLE IF EXISTS account;


CREATE TABLE customer (
name VARCHAR(20),
sex CHAR(1),
ssn CHAR(9) NOT NULL,
phone CHAR(15),
dob DATE,
address VARCHAR(50),
PRIMARY KEY(ssn)

);
  
CREATE TABLE account (
number CHAR(16) UNIQUE NOT NULL,
open_date DATE,
type CHAR(20),
owner_ssn CHAR(9) NOT NULL,
PRIMARY KEY(number)
);
  
CREATE TABLE transaction (
id INT(20) UNIQUE NOT NULL,
amount DECIMAL(9,2),
tdate DATE,
type CHAR(10),
account_num CHAR(16),
PRIMARY KEY(id)
);


INSERT INTO customer VALUE ('John Adam', 'M', '512432341', '(438) 321-2553', '1987-11-15',NULL);
INSERT INTO customer VALUE ('Alexander Felix', 'M', '724432341', '(541) 321-8553', '1991-05-22', NULL);
INSERT INTO customer VALUE ('Andrew William', 'M', '861894272', '(308) 692-1110', '1995-01-04', NULL);
INSERT INTO customer VALUE ('Ana Bert', 'F', '844192241', '(203) 932-7000', '1982-12-07', '23 Boston Post Rd, West Haven, CT 06516');

INSERT INTO account VALUE ('1111222233331441', '2018-12-03', 'Checking', '861894272');
INSERT INTO account VALUE ('2111222233332442', '2019-01-06', 'Saving', '512432341');
INSERT INTO account VALUE ('3111222233333443', '2017-09-22', 'Checking', '844192241');
INSERT INTO account VALUE ('4111222233335444', '2016-04-11', 'Checking', '724432341');
INSERT INTO account VALUE ('5111222233339445', '2018-11-05', 'Saving', '724432341');
INSERT INTO transaction VALUE (1001, 202.50, '2019-08-15', 'Deposit', '5111222233339445');
INSERT INTO transaction VALUE (1002, 100.00, '2019-09-21', 'Deposit','2111222233332442');
INSERT INTO transaction VALUE (1003, 200.00, '2019-09-29', 'Deposit', '2111222233332442');
INSERT INTO transaction VALUE (1004, 50.00, '2019-09-29', 'Deposit', '2111222233332442');
INSERT INTO transaction VALUE (1005, 1000.00, '2019-09-29', 'Deposit','3111222233333443');
INSERT INTO transaction VALUE (1006, -202.50, '2019-08-29', 'Withdraw', '5111222233339445');
INSERT INTO transaction VALUE (1007, 50.00, '2019-09-29', 'Deposit', '2111222233332442');
INSERT INTO transaction VALUE (1008, 50.00, '2019-09-29', 'Deposit', '2111222233332442');
INSERT INTO transaction VALUE (1009, -10.00, '2019-09-26', 'Withdraw', '2111222233332442');
INSERT INTO transaction VALUE (1010, 50.00, '2019-09-29', 'Deposit', '4111222233335444');
INSERT INTO transaction VALUE (1011, 320.00, '2019-09-29', 'Deposit', '5111222233339445');
INSERT INTO transaction VALUE (1012, 50.00, '2019-09-18', 'Deposit', '4111222233335444');
INSERT INTO transaction VALUE (1013, 5000.00, '2019-06-21', 'Deposit', '1111222233331441');
INSERT INTO transaction VALUE (1014, -100.00, '2019-09-02', 'Withdraw', '1111222233331441');
INSERT INTO transaction VALUE (1015, -200.00, '2019-09-08', 'Withdraw', '1111222233331441');
这就是我到目前为止所做的:

select number,type , Balance 
from account inner join  
(select account_num,sum(amount) 
as Balance from transaction
where customer.name = 'Alexander Felix');
我真的很希望能就下一步以及如何准确计算余额提供一些指导。非常感谢您的帮助/意见

试试看

select number, type, sum(amount) from (select a.number, a.type, t.amount  from
transaction t inner join account a on a.number = t.account_num inner join 
customer c on c.ssn = a.owner_ssn where c.name = 'Alexander Felix') sub 
group by number, type;
像这样

select a.number, a.type, b.Balance, c.name from account as a 
join (select account_num,sum(amount) as Balance from transaction group by account_num) as b on a.number = b.account_num
join (select name, ssn from customer) c on c.ssn = a.owner_ssn
where c.name = 'Alexander Felix';

我同意联合在这里是完全没有必要的,但你可以这样使用它:

SELECT number
     , type
     , SUM(amount) balance
  FROM 
     ( SELECT a.number
            , a.type 
            , t.amount 
         FROM account a 
         JOIN transaction t 
           ON t.account_num = a.number 
         JOIN customer c 
           ON c.ssn = owner_ssn 
        WHERE c.name = 'Alexander Felix' 
          AND t.type = 'Deposit'
        UNION ALL
       SELECT a.number
            , a.type 
            , t.amount
         FROM account a 
         JOIN transaction t 
           ON t.account_num = a.number 
         JOIN customer c 
           ON c.ssn = owner_ssn 
        WHERE c.name = 'Alexander Felix' 
          AND t.type = 'Withdraw' 
     ) x
 GROUP 
    BY number
     , type;
没有工会也一样

SELECT a.number
     , a.type 
     , SUM(amount) balance
  FROM account a 
  JOIN transaction t 
    ON t.account_num = a.number 
  JOIN customer c 
    ON c.ssn = owner_ssn 
 WHERE c.name = 'Alexander Felix'
 GROUP
    BY a.number,a.type;

我希望你在网上展示的不是真正的社交<代码>值必须是
。您可以像插入tablename值(column_value1,column_value2,column_value3,),(column_value1,column_value2,column_value3)那样执行操作。您的
选择显然不正确。您的
科目
表没有
余额
列(字段)。您应该
连接另一个表,而不是子查询中的一组结果。您甚至没有
客户
别名。只是评论。是的,这是预先写好的,是学习指南实践的一部分,所以这只是一个非常基本的粗略想法。你为什么有子查询?非常感谢!这里没有工会是的,没有工会,但它仍然有效,你会如何使用工会?谢谢!这管用!这里没有工会是的,这是真的,但它仍然完成了工作。我试着在某处之间建立一个联盟,但是在哪里?@CompTech它没有通过简报,所以不,它没有完成工作。啊,我明白了,所以,如果“撤回”被存储为正值,使用联盟基本上会使事情变得过于复杂,但这几乎是有意义的,但事实并非如此,所以我真的看不出重点——但也许我遗漏了一些东西。