1

現在、ユーザーが定義した期間の推定キャッシュフローを表示する SSRS レポートに取り組んでいます。例: 1 年先

私のテーブルは以下のようになります:

ID  DepositDate  DepositAmt  BalanceDueDate  TotalAmount  
--------------------------------------------------------  
1   02/06/2011   10%         02/07/2011              100
2   16/06/2011   10%         16/07/2011              200
3   08/07/2011   20%         08/08/2011              300
4   15/07/2011   10%         15/08/2011              400

処理する

Month  Amount
-------------
06         10 (10% (deposit %) of Total amount for ID 1)
06         20 (10% of Total amount for ID 2)
07         90 (balance amount after deposit from previous month for ID 1)
07        180 (balance amount after deposit from previous month for ID 2)
07         60 (20% of Total amount for ID 3)
07         40 (10% of Total amount for ID 4)
08        240 (balance amount after deposit from previous month for ID 3)
08        360 (balance amount after deposit from previous month for ID 4)

期待される出力

Month  Amount
-------------
06         30
07        370
08        600

CTE でいくつかのクエリを試してみましたが、迷ってしまいました。

誰か光を当てることができますか?

どうもありがとう

4

2 に答える 2

1

複数の月の期間を処理するものを次に示します。

with CashMovements as
(
  select *
    , CashMovement = DepositAmt * TotalAmount
    , CashPaid = DepositAmt * TotalAmount
  from Deposits
  union all
  select ID
    , dateadd(mm,1,DepositDate)
    , DepositAmt
    , BalanceDueDate
    , TotalAmount
    , CashMovement = case when dateadd(Month,1,DepositDate) >= BalanceDueDate
        then TotalAmount - CashPaid
      else DepositAmt * TotalAmount
      end
    , CashPaid = case when dateadd(mm,1,DepositDate) >= BalanceDueDate
        then CashPaid + (DepositAmt * TotalAmount)
      else 0.0
      end
  from CashMovements
  where dateadd(Month,1,DepositDate) <= BalanceDueDate
)
select Month = Month(DepositDate)
  , Amount = sum(CashMovement)
from CashMovements
group by Month(DepositDate)
order by Month

demo を使用した SQL Fiddle

データがこのケースを考慮する必要がない場合は、@Lamak の単純なソリューションを使用するのが最善です。

于 2013-06-17T19:04:17.183 に答える
1

どうぞ:

SELECT  [Month],
        SUM(Amount) Amount
FROM (  SELECT  MONTH(DepositDate) [Month],
                DepositAmt * TotalAmount Amount
        FROM YourTable

        UNION ALL
        SELECT  MONTH(BalanceDueDate),
                TotalAmount * (1 - DepositAmt)
        FROM YourTable) A
GROUP BY [Month]
ORDER BY [Month]

結果:

╔═══════╦════════╗
║ Month ║ Amount ║
╠═══════╬════════╣
║     6 ║     30 ║
║     7 ║    370 ║
║     8 ║    600 ║
╚═══════╩════════╝

これはデモ付きのsqlfiddleです。

ただし、結果セットに年を追加することを検討する必要があります。そうしないと、結果が混在する可能性があります。

于 2013-06-17T18:45:53.807 に答える