<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
    主站蜘蛛池模板: 国产做床爱无遮挡免费视频| **真实毛片免费观看| 好男人视频社区精品免费| 亚洲欧洲春色校园另类小说| 狼群影院在线观看免费观看直播| 国产成A人亚洲精V品无码| 两个人看的www免费高清| 久久久久久亚洲av成人无码国产| 久久永久免费人妻精品| 久久久亚洲欧洲日产国码aⅴ | 成在线人免费无码高潮喷水| 国产亚洲精品国看不卡| 久久久久久av无码免费看大片| 亚洲精品卡2卡3卡4卡5卡区| 麻豆精品成人免费国产片| 亚洲黄色片免费看| 好男人www免费高清视频在线| 亚洲色成人WWW永久在线观看| 四虎永久在线精品免费观看地址| 美女被羞羞网站免费下载| 国产亚洲精品国产| xxxxx免费视频| 国产亚洲高清在线精品不卡| 在线日韩日本国产亚洲| 最近高清中文字幕免费| 亚洲一线产品二线产品| 亚洲午夜成人精品电影在线观看| a级毛片100部免费观看| 亚洲人成7777| 亚洲偷自拍拍综合网| 91成人在线免费视频| 国产精品亚洲专区一区| 国产亚洲无线码一区二区| 成人免费午夜无码视频| j8又粗又长又硬又爽免费视频| 亚洲黄色网站视频| 亚洲乱亚洲乱少妇无码| 99视频全部免费精品全部四虎| 亚洲狠狠婷婷综合久久| 亚洲va在线va天堂va四虎| 免费看少妇作爱视频|