2014-10-29 5 views
0

вот моя задача:, что мне не хватает

Создать вид 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) 
); 

здесь мои 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 возвращает правильную таблицу исключением случаев, когда у человека нет векселей, прошедших duedate, например:

John: accou нт баланс составляет 1000 $, а его счета в прошлом DueDate 400 $, то вид FinancialStatus возвращает правильные результаты, которые являются:

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

здесь, когда речь идет не так:

Джон: Баланс счета 1000 $ a нет счетов за прошлый год

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

что мне не хватает ?? :)

+0

Вы уверены, что pid 5 присутствует в долгах, итогах и людях? –

+0

Вам нужно использовать ссылку «Влево». все ваши запросы являются внутренними соединениями. – Andrew

ответ

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% точный.

Смежные вопросы