2013-04-16 88 views
0

嘗試創建一個具有餘額到期,利息費用,到期總額和付款計劃的結果集。他們的方式我編碼它似乎工作,但它似乎很不雅。有沒有辦法利用變量來使代碼更清晰?select語句上的sql變量

SELECT 
    CustFName, CustLName, CustPhone, 
    SUM(InvoiceAmount - PaymentAmount) AS BalanceDue, 
    SUM(InvoiceAmount - PaymentAmount)*.195 AS InterestCharge, 
    SUM(InvoiceAmount - PaymentAmount) + SUM(InvoiceAmount - PaymentAmount) *.195 AS TotalDue, 
    (SUM(InvoiceAmount - PaymentAmount) + SUM(InvoiceAmount - PaymentAmount) *.195)/4 AS PaymentPlan 
FROM 
    Customer 
JOIN 
    Vehicle ON Customer.CustomerID = Vehicle.CustomerID 
JOIN 
    Invoice ON Vehicle.VehicleID = Invoice.VehicleID 
WHERE 
    InvoiceAmount - PaymentAmount > 400 
GROUP BY 
    CustFName, CustLName, CustPhone 
+0

這看起來不像'inelegant':無論如何都是一個主觀術語。這似乎很好的佈局,如果它工作正常 –

+0

好的謝謝你!我是新手,不確定是否有更好的方法。 –

+0

你正在使用什麼數據庫系統? –

回答

0
DECLARE @p FLOAT 
SET @p = 0.195 
SELECT CustFName, CustLName, CustPhone, SUM(InvoiceAmount - PaymentAmount) AS BalanceDue, 
    SUM(InvoiceAmount - PaymentAmount)*@p AS InterestCharge, 
    SUM(InvoiceAmount - PaymentAmount) + SUM(InvoiceAmount - PaymentAmount) *@p AS TotalDue, 
    (SUM(InvoiceAmount - PaymentAmount) + SUM(InvoiceAmount - PaymentAmount) *@p)/4 AS PaymentPlan 

FROM Customer JOIN Vehicle 
    ON Customer.CustomerID = Vehicle.CustomerID 
    JOIN Invoice 
    ON Vehicle.VehicleID = Invoice.VehicleID 

WHERE InvoiceAmount - PaymentAmount > 400 

GROUP BY CustFName, CustLName, CustPhone 
+0

您可以提取變量以避免重複硬編碼常量 – TGH

0

使用虛擬表。除此之外,很好地完成。 :-)

SELECT 
    CustFName, CustLName, CustPhone, 
    BalanceDue, 
    BalanceDue * Factor AS InterestCharge, 
    BalanceDue + BalanceDue * Factor AS TotalDue, 
    (BalanceDue + BalanceDue * Factor)/4 AS PaymentPlan 
from (
     SELECT 
      CustFName, CustLName, CustPhone, 0.195 as Factor 
      SUM(InvoiceAmount - PaymentAmount) AS BalanceDue 
     FROM 
      Customer 
     JOIN 
      Vehicle ON Customer.CustomerID = Vehicle.CustomerID 
     JOIN 
      Invoice ON Vehicle.VehicleID = Invoice.VehicleID 
     WHERE 
      InvoiceAmount - PaymentAmount > 400 
     GROUP BY 
      CustFName, CustLName, CustPhone 
) as A;