2013-04-16 4 views
0

Пытается создать результирующий набор, у которого есть баланс, проценты, общая сумма и план платежей. Они как-то кодируют, похоже, работают, но кажется очень неэлегантным. Есть ли способ использовать переменные, чтобы сделать код более понятным?sql variable on select statement

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;