<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    紙飛機

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      22 隨筆 :: 28 文章 :: 30 評論 :: 0 Trackbacks

    問題:根據另一列中的值修改累計和中的值。假設一個場景,要顯示信用卡賬號的事務處理歷史以及每次事務處理洲改累計和中的值。假設一個場景,要顯示信用卡賬號的事務處理歷史以及每次事務處理之后的當前余額。在這個例子中,將使用下面給出的視圖V:

    create view V (id,amt,trx)

    as

    select 1, 100, 'PR' from t1 union all

    select 2, 100, 'PR' from t1 union all

    select 3, 50,   'PY' from t1 union all

    select 4, 100, 'PR' from t1 union all

    select 5, 200, 'PY' from t1 union all

    select 6, 50,   'PY' from t1

    select * from V

    ID         AMT TR

    -- ---------- --

    1         100 PR

    2         100 PR

    3          50 PY

    4         100 PR

    5         200 PY

    6          50 PY

    ID列唯一標識每次事務處理。AMT列表示每次事務處理(取款或存款)涉及的金額。TRX列定義了事務處理的類型;取款是“PY”,存款是“PR”。如果TRX值是PY,則想要從累計和中減去AMT值代表的金額;如果TRX值是PR,則想要給累計和加上AMT值代表的金額。最后應該返回如下結果集:

    TRX_TYPE         AMT     BALANCE

    -------- ---------- ----------

    PURCHASE         100         100

    PURCHASE         100         200

    PAYMENT           50         150

    PURCHASE         100         250

    PAYMENT          200          50

    PAYMENT           50           0

    解決方案

    DB2和Oracle

    使用窗口函數SUM OVER創建累計和,并使用CASE表達式判斷事務處理的類型:

    1   select case when trx = 'PY'

    2               then 'PAYMENT'

    3               else 'PURCHASE'

    4           end trx_type,

    5           amt,

    6           sum(

    7            case when trx = 'PY'

    8               then -amt else amt

    9            end

    10          ) over (order by id,amt) as balance

    11     from V

    MySQL、PostgreSQL和SQL Server

    使用標量子查詢創建累計和,并使用CASE表達式判斷事務處理的類型:

    1   select case when v1.trx = 'PY'

    2               then 'PAYMENT'

    3               else 'PURCHASE'

    4           end as trx_type,

    5           v1.amt,

    6           (select sum(

    7                    case when v2.trx = 'PY'

    8                         then -v2.amt else v2.amt

    9                    end

    10                   )

    11              from V v2

    12             where v2.id <= v1.id) as balance

    13     from V v1

    討論

    CASE表達式判斷是該給累計和加上當前的AMT值還是從中減去當前的AMT值 。如果事務處理是取款,則把AMT更改為負值,這樣就減少了累計和。CASE表達式的結果如下所示:

    select case when trx = 'PY'

                 then 'PAYMENT'

                 else 'PURCHASE'

            end trx_type,

            case when trx = 'PY'

                 then -amt else amt

            end as amt

       from V

    TRX_TYPE        AMT

    -------- ---------

    PURCHASE        100

    PURCHASE        100

    PAYMENT         -50

    PURCHASE        100

    PAYMENT        -200

    PAYMENT         -50

    在確定了事務處理類型之后,就可以從累計和中加上或者減去AMT值。有關窗口函數SUM OVER或標量子查詢如何創建累計和的說明,請參閱“計算累計和”。

    posted on 2008-05-14 21:51 紙飛機 閱讀(418) 評論(0)  編輯  收藏 所屬分類: Database
    主站蜘蛛池模板: 免费看的成人yellow视频| 免费国产黄网站在线观看视频| 国产精品成人免费福利| 亚洲精品无码成人AAA片| 中国极品美軳免费观看| 亚洲午夜久久久影院| 中文无码日韩欧免费视频| 亚洲日韩国产成网在线观看| 边摸边吃奶边做爽免费视频99| 国产嫩草影院精品免费网址| 国产午夜亚洲精品不卡| 亚洲А∨精品天堂在线| 免费又黄又爽又猛大片午夜| 亚洲国产精品一区二区九九| 一级黄色毛片免费看| 亚洲人成网站在线观看播放| 黄视频在线观看免费| 国产亚洲av片在线观看播放| 99在线免费视频| 亚洲专区先锋影音| 四虎在线成人免费网站| 亚洲欧美中文日韩视频| 永久免费看bbb| 久久精品免费大片国产大片| 亚洲成AV人在线观看天堂无码| 67194成手机免费观看| 亚洲色精品VR一区区三区| 国产一卡二卡≡卡四卡免费乱码 | 国产91久久久久久久免费| 黄色毛片免费网站| 亚洲AV人无码激艳猛片| 999久久久免费精品国产| 国产亚洲人成在线播放| 亚洲情XO亚洲色XO无码| 成年人网站免费视频| 处破女第一次亚洲18分钟| 亚洲av无码一区二区三区网站| 中文字幕免费高清视频| 日日摸日日碰夜夜爽亚洲| 亚洲欧洲国产日韩精品| 色播在线永久免费视频|