2013-02-20 104 views
1

我想避免使用嵌套的選定語句,如果我可以(我懷疑我會遇到性能問題)。我試圖從財務交易表中獲得每種類型交易的總額。我猜我可以使用同一張表中的多個選擇,但是我的'BFWD'數字通過"bil_yer + 1"返回結果(不僅僅是原始的bil_yer)。任何建議將不勝感激。替代嵌套選擇語句

SELECT bil_yer, 
    acc_num, 
    ubsgch_key_num, 
    sum(bfw_arr) AS bfw_arr, 
    sum(bfw_int) AS bfw_int, 
    sum(ytd_chg) AS ytd_chg, 
    sum(ytd_och) AS ytd_och 
FROM (
    -- BFWD Charges 
    SELECT src_bil_yer + 1 AS bil_yer, 
     src_acc_num AS acc_num, 
     des_ubsgch_key_num AS ubsgch_key_num, 
     src_trn_amt AS bfw_arr, 
     0 AS bfw_int, 
     0 AS ytd_chg, 
     0 AS ytd_och 
    FROM av_ub_tran 
    WHERE src_trn_cde <> 2601 

    UNION ALL -- BFWD Interest 
    SELECT src_bil_yer + 1 AS bil_yer, 
     src_acc_num AS acc_num, 
     des_ubsgch_key_num AS ubsgch_key_num, 
     0 AS bfw_arr, 
     src_trn_amt AS bfw_int, 
     0 AS ytd_chg, 
     0 AS ytd_och 
    FROM av_ub_tran 
    WHERE src_trn_cde = 2601 

    UNION ALL -- YTD Current Charges - Raised in the current year but NOT past due 
    SELECT src_bil_yer AS bil_yer, 
     src_acc_num AS acc_num, 
     des_ubsgch_key_num AS ubsgch_key_num, 
     0 AS bfw_arr, 
     0 AS bfw_int, 
     src_trn_amt AS ytd_chg, 
     0 AS ytd_och 
    FROM av_ub_tran 
    WHERE src_trn_cde = 2600 
     AND src_due_dte >= 'TODAY' 

    UNION ALL -- YTD Current Overdue Charges - Raised in the current year but PAST due 
    SELECT src_bil_yer AS bil_yer, 
     src_acc_num AS acc_num, 
     des_ubsgch_key_num AS ubsgch_key_num, 
     0 AS bfw_arr, 
     0 AS bfw_int, 
     0 AS ytd_chg, 
     src_trn_amt AS ytd_och 
    FROM av_ub_tran 
    WHERE src_trn_cde = 2600 
     AND src_due_dte < 'TODAY' 
) 
GROUP BY 
    bil_yer, 
    acc_num, 
    ubsgch_key_num 
+0

您使用的是什麼RDBMS? – valex 2013-02-20 10:29:24

回答

0

您沒有提到您使用的RDBMS,但大多數RDBMS有一個CASE statement。你可以使用它。您在第一個子查詢中使用src_bil_yer + 1,並且它是group by字段,因此無論如何您必須使用嵌套查詢。 請嘗試以下查詢:

SELECT 
    bil_yer, 
    acc_num, 
    ubsgch_key_num, 
    sum(bfw_arr) AS bfw_arr, 
    sum(bfw_int) AS bfw_int, 
    sum(ytd_chg) AS ytd_chg, 
    sum(ytd_och) AS ytd_och 
FROM (
    SELECT src_bil_yer + 1 AS bil_yer, 
     src_acc_num AS acc_num, 
     des_ubsgch_key_num AS ubsgch_key_num, 
     CASE WHEN src_trn_cde <> 2601 THEN src_trn_amt ELSE 0 END AS bfw_arr, 
     CASE WHEN src_trn_cde = 2601 THEN src_trn_amt ELSE 0 END AS bfw_int, 
     0 AS ytd_chg, 
     0 AS ytd_och 
    FROM av_ub_tran 

    UNION ALL 
    SELECT src_bil_yer AS bil_yer, 
     src_acc_num AS acc_num, 
     des_ubsgch_key_num AS ubsgch_key_num, 
     0 AS bfw_arr, 
     0 AS bfw_int, 
     CASE WHEN src_due_dte >= 'TODAY' THEN src_trn_amt ELSE 0 END AS ytd_chg, 
     CASE WHEN src_due_dte < 'TODAY' THEN src_trn_amt ELSE 0 END AS ytd_och 
    FROM av_ub_tran 
    WHERE src_trn_cde = 2600 
) 
GROUP BY 
    bil_yer, 
    acc_num, 
    ubsgch_key_num