2013-04-27 2 views
1

Я использую SQL Server 2008. У меня есть таблица AdvanceEntry.Отображать данные как в реестре

-------------------------------------------------------------------------------- 
    Code | PaidDate |  Amount  | ReceiveDate | ReceiveAmount 
-------------------------------------------------------------------------------- 
    102 | 15-04-2004 |  3000  |  20-04-2004 |  2000 
    104 | 23-05-2006 |  1000  |  NULL  |  0.00 
    104 | 25-05-2005 |  1500  |  12-06-2005 |  500 

Когда любой человек лавировать Заем то сумма займа хранится в Amount колонки и дата хранится в PaidDate и лицах код хранится в Code колонки. Когда это лицо возвращает сумму, то эта сумма хранится в ReceiveAmount, а дата хранится в ReceiveDate.

Теперь я хочу создать отчет, например, регистратор определенного кода.

Например, код 102

---------------------------------------------------------------------------- 
PaidDate/ReceiveDate | Amount | ReceiveAmount | Balance 
---------------------------------------------------------------------------- 
    15-04-2004    | 3000  |  0   | 3000 
    20-04-2004    |  0  |  2000  | 1000 

И для кода 104

---------------------------------------------------------------------------- 
PaidDate/ReceiveDate | Amount | ReceiveAmount | Balance 
---------------------------------------------------------------------------- 
    23-05-2006    | 1000  |  0   | 1000 
    25-05-2005    | 1500  |  0   | 2500 
    12-06-2005    |  0  |  500   | 2000 

Как я могу это сделать? Пожалуйста, помогите мне .. Спасибо

+0

Возможно, это возможно в TSQL-коде, но было бы гораздо лучше использовать инструмент отчетности или настраиваемое приложение для форматирования данных для презентации. TSQL не является хорошим языком для форматирования или представления данных. – Pondlife

ответ

1

Вот один из способов сделать это:

with Paid as 
(
    select Code 
    , PaidDate 
    , Amount 
    from AdvanceEntry 
    where PaidDate is not null 
), Received as 
(
    select Code 
    , ReceiveDate 
    , ReceiveAmount 
    from AdvanceEntry 
    where ReceiveDate is not null 
), Details as 
(
    select Code = coalesce(p.Code, r.Code) 
    , CodeDate = coalesce(p.PaidDate, r.ReceiveDate) 
    , Amount = sum(p.Amount) 
    , ReceiveAmount = sum(r.ReceiveAmount) 
    from Paid p 
    full join Received r on p.PaidDate = r.ReceiveDate and p.Code = r.Code 
    group by coalesce(p.Code, r.Code) 
    , coalesce(p.PaidDate, r.ReceiveDate) 
) 
select d.Code 
    , PayReceiveDate = d.CodeDate 
    , Amount = isnull(d.Amount, 0.0) 
    , ReceiveAmount = isnull(d.ReceiveAmount, 0.0) 
    , Balance = isnull(b.Balance, 0.0) 
from Details d 
    outer apply (select Balance = sum(isnull(b.Amount, 0.0) - isnull(b.ReceiveAmount, 0.0)) 
       from Details b where d.Code = b.Code and d.CodeDate >= b.CodeDate) b 
order by d.Code, d.CodeDate 

SQL Fiddle with demo.

Похоже, что у вас была небольшая опечатка в ваших данных; Я немного изменил его в скрипке, чтобы получить ожидаемые результаты.

Также стоит упомянуть, что если вы получаете только одно действие оплаты/получения в день за код, вы можете уйти без запроса GROUP BY.

0

попробовать это (непроверенные):

;with cte as (
    select Code, PaidDate as Date, Amount as Dr, 0 as Cr, Amount as Net 
    from Data where PaidDate is not null 
    union all 
    select Code, ReceivedData as Date, 0 as Dr, -ReceivedAmount as Cr, -ReceivedAmount as Net 
    from Data where ReceivedDate is not null 
) 
select 
    t1.*, sum(t2.Net) as Balance 
from cte as t1 
left join cte as t2 on t2.Code = t1.Code and t2.Date <= t1.Date 
group by 
    t1.Code, t1.Date 
having t1.Code = @Code 
+0

Его работа, но не дает результат, как я хочу. – Prashant16

+0

@ Prashant16: как это так? –

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