2015-05-06 63 views
1

我有這樣的查詢。我想使用PaidAmount列來計算另一列。可能嗎?在另一列中使用子查詢列

SELECT 
    B.SubProjectCode, 
    A.StatementBreakDown, 
    A.Description, 
    A.ApplicableInvoices, 
    A.AgreedAmount, 
    A.SettlePercentage, 
    (A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle, 
    (SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID) PaidAmount, 
    (DueToSettle - PaidAmount) BalanceAmt 
FROM VendorSOA A 
INNER JOIN SubProject B 
    ON A.SubProjectID = B.SubProjectID 

回答

1

試試這個

Select *,(DueToSettle - PaidAmount) BalanceAmt 
    from  
    (SELECT 
     B.SubProjectCode, 
     A.StatementBreakDown, 
     A.Description, 
     A.ApplicableInvoices, 
     A.AgreedAmount, 
     A.SettlePercentage, 
     (A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle, 
     (SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID) PaidAmount 
     FROM VendorSOA A 
     INNER JOIN SubProject B 
     ON A.SubProjectID = B.SubProjectID) as Main 
+0

這似乎是最優雅的方式我覺得..感謝您的想法。 –

2

使用公用表表達式(CTE),它不會損害性能。

;WITH CTE as 
(
    SELECT 
    B.SubProjectCode, 
    A.StatementBreakDown, 
    A.Description, 
    A.ApplicableInvoices, 
    A.AgreedAmount, 
    A.SettlePercentage, 
    (A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle, 
    (SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID) PaidAmount, 
    (DueToSettle - PaidAmount) BalanceAmt 
    FROM VendorSOA A 
    INNER JOIN SubProject B 
    ON A.SubProjectID = B.SubProjectID 
) 
SELECT 
    SubProjectCode, 
    StatementBreakDown, 
    Description, 
    ApplicableInvoices, 
    AgreedAmount, 
    SettlePercentage, 
    DueToSettle, 
    PaidAmount, 
    (DueToSettle - PaidAmount) BalanceAmt 
FROM CTE 
0

你可以嘗試做一個臨時表/視圖「與」條款,並從該表中使用列計算出您的另一列

with temp as 
(SELECT 
    B.SubProjectCode, 
    A.StatementBreakDown, 
    A.Description, 
    A.ApplicableInvoices, 
    A.AgreedAmount, 
    A.SettlePercentage, 
    (A.AgreedAmount * (A.SettlePercentage/100)) DueToSettle, 
    (SELECT SUM(C.PaymentAmount) FROM VendorSOAPayments C WHERE C.VendorSOAID = A.VendorSOAID) PaidAmount,  
FROM VendorSOA A 
INNER JOIN SubProject B 
    ON A.SubProjectID = B.SubProjectID) 
select 
    SubProjectCode, 
    StatementBreakDown, 
    Description, 
    ApplicableInvoices, 
    AgreedAmount, 
    SettlePercentage, 
    DueToSettle, 
    PaidAmount, 
    (DueToSettle - PaidAmount) as BalanceAmt 
from temp; 
0

您也可以使用APPLY

CROSS APPLY的工作方式類似於INNER JOIN,即必須從子查詢返回結果,否則整個行將被丟棄。總是會有一排DueToSettle的值,所以在這裏使用它是安全的。

OUTER APPLY的作品就像一個LEFT OUTER JOIN,這是我的第二個查詢選擇已經使用從一個單獨的表:

SELECT 
    B.SubProjectCode, 
    A.StatementBreakDown, 
    A.Description, 
    A.ApplicableInvoices, 
    A.AgreedAmount, 
    A.SettlePercentage, 
    DueToSettle.SettleAmount, 
    Payments.PaidAmount, 
    (DueToSettle.SettleAmount - Payments.PaidAmount) BalanceAmt 
FROM VendorSOA A 
INNER JOIN SubProject B 
    ON A.SubProjectID = B.SubProjectID 
CROSS APPLY(VALUES(A.AgreedAmount * (A.SettlePercentage/100))) DueToSettle(SettleAmount) 
OUTER APPLY 
(
    SELECT 
    SUM(C.PaymentAmount) 
    FROM VendorSOAPayments C 
    WHERE C.VendorSOAID = A.VendorSOAID 
) Payments(PaidAmount); 
相關問題