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

これどうやってするの?私を助けてください..ありがとう

4

2 に答える 2

1

これを行う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

demo を使用した SQL Fiddle

また、データにわずかなタイプミスがあったようです。期待どおりの結果が得られるように、フィドルで少し変更しました。

また、コードごとに 1 日 1 回の支払い/受け取りアクションしか取得しない場合GROUP BYは、クエリに何も入力せずに済むことにも言及する価値があります。

于 2013-04-27T20:54:19.673 に答える