Хорошо, таким образом, я думаю, что должен неправильно понимать что-то о SQL-запросах. Это - довольно многословный вопрос, поэтому благодарит занять время для чтения его (моя проблема является правильной в конце, все остальное - просто контекст).
Я пишу систему учета, которая работает над принципалом двойной бухгалтерии - деньги всегда перемещаются между учетными записями, транзакция равняется 2 или больше TransactionParts
строки, постепенно уменьшающие одну учетную запись и увеличивающие другого.
Некоторые TransactionParts
строки могут быть отмечены как налог, связанный так, чтобы система могла представить отчет общих продаж/покупок VAT и т.д., таким образом, возможно, что единственная Транзакция может иметь два TransactionParts
ссылка на ту же Учетную запись - один VAT, связанный, и другой нет. Для упрощения презентации до пользователя у меня есть представление для объединения нескольких строк для той же учетной записи и транзакции:
create view Accounting.CondensedEntryView as
select p.[Transaction], p.Account, sum(p.Amount) as Amount
from Accounting.TransactionParts p
group by p.[Transaction], p.Account
У меня затем есть представление для вычисления под управлением итоговой колонки, следующим образом:
create view Accounting.TransactionBalanceView as
with cte as
(
select ROW_NUMBER() over (order by t.[Date]) AS RowNumber,
t.ID as [Transaction], p.Amount, p.Account
from Accounting.Transactions t
inner join Accounting.CondensedEntryView p on p.[Transaction]=t.ID
)
select b.RowNumber, b.[Transaction], a.Account,
coalesce(sum(a.Amount), 0) as Balance
from cte a, cte b
where a.RowNumber <= b.RowNumber AND a.Account=b.Account
group by b.RowNumber, b.[Transaction], a.Account
По причинам я еще не удался, определенная транзакция (ID=30) не появляется на выписке по счету для пользователя. Я подтвердил это путем выполнения
select * from Accounting.TransactionBalanceView where [Transaction]=30
Это дало мне следующий результат:
RowNumber Transaction Account Balance
-------------------- ----------- ------- ---------------------
72 30 23 143.80
Как я сказал прежде, должны быть по крайней мере два TransactionParts
для каждой Транзакции, таким образом, один из них не представляется, по моему мнению. Я предположил, что должна быть проблема со способом, которым я записал свое представление и выполнил запрос, чтобы видеть, существует ли что-либо еще пропавшие без вести:
select [Transaction], count(*)
from Accounting.TransactionBalanceView
group by [Transaction]
having count(*) < 2
Этот запрос не возвращает результатов - даже для Транзакции 30! Думая я должен быть идиотом, я выполняю следующий запрос:
select [Transaction]
from Accounting.TransactionBalanceView
where [Transaction]=30
Это возвращает две строки! Так select *
возвраты только одна строка и select [Transaction]
возвраты оба. После большого царапания головы и повторного выполнения последних двух запросов, я пришел к заключению, что не имею ни малейшего представления, что происходит. Какие-либо идеи?
Большое спасибо, если Вы придерживались меня настолько далеко!
Вот планы выполнения:
выберите *
выберите [Транзакция]
1 000 строк каждый, следовательно находя где-то в другом месте для хостинга.
Для полноты вот таблицы, которые я использовал:
create table Accounting.Accounts
(
ID smallint identity primary key,
[Name] varchar(50) not null
constraint UQ_AccountName unique,
[Type] tinyint not null
constraint FK_AccountType foreign key references Accounting.AccountTypes
);
create table Accounting.Transactions
(
ID int identity primary key,
[Date] date not null default getdate(),
[Description] varchar(50) not null,
Reference varchar(20) not null default '',
Memo varchar(1000) not null
);
create table Accounting.TransactionParts
(
ID int identity primary key,
[Transaction] int not null
constraint FK_TransactionPart foreign key references Accounting.Transactions,
Account smallint not null
constraint FK_TransactionAccount foreign key references Accounting.Accounts,
Amount money not null,
VatRelated bit not null default 0
);