这是我的任务:
创建一个 View FinancialStatus,显示每个拥有
帐户、该人的 PID 和 pName 以及他们拥有的总金额
他们的账户减去所有逾期未付的账单。
这是我的表格:
CREATE TABLE People (
PID INT,
pName VARCHAR(50),
pGender CHAR(1),
pHeight FLOAT,
PRIMARY KEY (PID)
);
CREATE TABLE Accounts (
AID INT AUTO_INCREMENT, -- IDENTITY for MS-SQL
PID INT,
aDate DATE,
aBalance INT,
aOver INT,
PRIMARY KEY (AID),
FOREIGN KEY (PID) REFERENCES People(PID)
);
CREATE TABLE Bills (
BID INT AUTO_INCREMENT, -- IDENTITY for MS-SQL
PID INT,
bDueDate DATE NOT NULL,
bAmount INT,
bIsPaid BIT NOT NULL,
PRIMARY KEY (BID),
FOREIGN KEY (PID) REFERENCES People(PID)
);
这是我迄今为止的查询:
create view debts as
select b.bispaid, p.pid, p.pname, sum(b.bamount) as bamount2
from bills b, people p
where p.pid = b.pid
AND b.bDueDate < curdate()
AND b.bispaid = 0
group by p.pid;
CREATE VIEW totalbal AS
SELECT P.PID, P.pName, SUM(A.aBalance) as bal
FROM People P, Accounts A
WHERE P.PID = A.PID
GROUP BY P.PID;
create view FinancialStatus as
select p.pid, p.pName, (t.bal - d.bamount2) as remains
from totalbal t, debts d, people p
where p.pid = d.pid
AND p.pid = t.pid;
-- group by p.pid;
select * from FinancialStatus;
这是错误的:
FinancialStatus View 会返回正确的表,除非该人没有过期的账单,例如:
John:帐户余额为 1000 美元,他的逾期账单为 400 美元,那么 FinancialStatus View 将返回正确的结果:
...
4 Doe 346$
5 John 600$
6 Boe 1900$
...
这里是出错的时候:
约翰:账户余额为 1000 美元,没有逾期账单
...
4 Doe 346$
<-here is supposed to be : 5 John 1000$
6 Boe 1900$
...
我错过了什么? :)
最佳答案
我认为您必须执行左连接,因为 debts
View 没有 John 的记录。
create view FinancialStatus as
select p.pid, p.pName, (t.bal - IFNULL(d.bamount2, 0)) as remains
from totalbal t
inner join people p on p.pid = t.pid
left join debts d on p.pid = d.pid
请注意,我没有使用 MySql 的经验,因此我不确定语法是否 100% 准确。
关于mysql - 我错过了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26638575/