1

次のことを手伝ってください。

次の表 (サンプル) では、現在の行の Txndate と次の行の Txndate の差が Dayscount フィールドにあるはずですが、両方の行の Acctno が同じ場合に限ります。AcctNo が異なる場合、Dayscount は特定の固定日付から派生する必要があります (この例では 31 Mar 12 が使用されています)。Product 列には、Amount1 と DaysCount の積が含まれます。

+--------+------------------+----------------------+---------+-------------+----------+
|  P_ID  |      AcctNo      |              TxnDate | Amount1 |   DAYSCOUNT |  Product |
+--------+------------------+----------------------+---------+-------------+----------+
| 108161 | 0019061_A0100501 | 30/01/2012           |     250 |             |          |
| 108162 | 0019061_A0100501 | 03/02/2012           |  -23000 |             |          |
| 108163 | 0019061_A0100502 | 09/02/2012           |    -215 |             |          |
| 108164 | 0019061_A0100502 | 24/02/2012           |   -1103 |             |          |
+--------+------------------+----------------------+---------+-------------+----------+

予想される出力を以下に示します。

+--------+------------------+--------------------------+----------+-----------+---------------+
|  P_ID  |      AcctNo      |              TxnDate     | Amount1  | DAYSCOUNT |    Product    |
+--------+------------------+--------------------------+----------+-----------+---------------+
| 108161 | 0019061_A0100501 | 30/01/2012               |      250 |         4 |          1000 |
| 108162 | 0019061_A0100501 | 03/02/2012               |   -23000 |        57 |      -1311000 |
| 108163 | 0019061_A0100502 | 09/02/2012               |     -215 |        15 |         -3225 |
| 108164 | 0019061_A0100502 | 24/02/2012               |    -1103 |        36 |        -39708 |
|        |                  |                          |          |           |               |
+--------+------------------+--------------------------+----------+-----------+---------------+
4

3 に答える 3

0

テーブルを何度もループする必要がある場合は、クラスで再帰を使用することを検討してください

于 2013-04-04T11:08:52.587 に答える
0
WITH CTE AS (
    SELECT ROW_NUMBER() OVER(ORDER BY P_ID) AS RowNumber, *
    FROM TableName)

SELECT CTE1.P_ID,
       CTE1.AcctNo,
       CTE1.TxnDate,
       CTE1.Amount1, 
       DATEDIFF (DD, 
          CTE1.TxnDate,
          CASE WHEN CTE1.AcctNo = ISNULL(CTE2.AcctNo,'')
               THEN CTE2.TxnDate
               ELSE '20120331'
          END) AS DAYSCOUNT,
       DATEDIFF (DD,
          CTE1.TxnDate,
          CASE WHEN CTE1.AcctNo = ISNULL(CTE2.AcctNo,'')
               THEN CTE2.TxnDate
               ELSE '20120331'
          END) * CTE1.Amount1 AS Product
       FROM CTE AS CTE1
LEFT JOIN CTE AS CTE2 ON (CTE1.RowNumber + 1 = CTE2.RowNumber)
于 2013-04-04T11:21:49.060 に答える