2014-10-29 124 views
0

這裏是我的任務:缺少什麼我

創建顯示視圖FinancialStatus,爲每個有
賬戶,人的PID和PNAME人,總金額他們
上他們的賬戶減去所有過期到期的未付賬單。

這裏是我的tabels:

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) 
); 

這裏是我的querys至今:

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視圖返回右表時除外該人沒有過去管理的帳單,例如:

John:accou NT餘額爲$ 1000,而他的賬單過去的交貨期是400 $,則FinancialStatus視圖返回這是正確的結果:

... 
4 Doe 346$ 
5 John 600$ 
6 Boe  1900$ 
... 

這裏時出錯:

約翰:賬戶餘額爲$ 1000一個沒有票據過去直接付款

... 
    4 Doe 346$ 
         <-here is supposed to be : 5 John 1000$ 
    6 Boe 1900$ 
    ... 

我在想什麼? :)

+0

你確定pid 5存在於債務,totalbal和人嗎? – 2014-10-29 19:10:05

+0

您需要使用左外連接。你所有的查詢都是內連接。 – Andrew 2014-10-29 19:11:13

回答

0

我認爲你必須做一個左連接,因爲debts視圖沒有約翰的記錄。

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%準確。