2015-03-24 3 views
0

Это мой запрос, который я выполняю в SQL DBX. Но я хочу вычесть из этого запроса, который не работает. Я хочу вычесть actual_amount и Depri.Как вычесть один столбец и один алис в одной таблице?

Но в моем запросе не работает:

SELECT 
    b.bank_v_id 
    ,a.venumber 
    ,b.recept_date 
    ,b.dayly_amount 
    ,b.actual_amount 
    ,(DATEDIFF(b.recept_date,'2015-03-09')*b.dayly_amount) "Depri" 
FROM 
    bank_vehicle_master a, tax_details b 
WHERE 
    a.bank_v_id = b.bank_v_id 
    AND a.del_rec = 0 
    AND b.del_rec = 0 
ORDER BY 
    a.bank_v_id 

Выход:

bank_v_id venumber recept_date  dayly_amount actual_amount Depri  
    3  MH 07 Q 1313 17-12-2014   300   30000  -24600  
    4  MH 07 Q 1414 16-12-2014   150   15000  -12450  
    5  MH 07 Q 1555 16-12-2014   160   16000  -13280  

Я хочу, чтобы вычитать два столбца в этом выше, что является вычитание actual_amount и Depri.

Как написать запрос?

+0

[Вредные привычки пинать: использование старого стиля JOIN и] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old -style-joins.aspx) - стиль старого стиля * разделенный запятыми список таблиц * был заменен на * правильный * ANSI 'JOIN' синтаксис в ANSI - ** 92 ** SQL Standard (** более 20 лет ** назад), и его использование не рекомендуется –

+1

Какие RDBMS это для? Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

ответ

1

Ссылаясь на псевдоним, а не на переписывание всей формулы снова, безусловно, является хорошей практикой. Это упрощает обслуживание. Для этого вам нужно переместить вычитание на внешний запрос, иначе вы не сможете ссылаться на свой псевдоним в предложении SELECT запроса.

Другой ответ NoDisplayName также дает очень хорошее представление об использовании INNER JOIN вместо старых сочетаний в стиле запятой.

Так что-то вроде этого:

SELECT bank_v_id, 
    venumber, 
    recept_date, 
    dayly_amount, 
    actual_amount 
    Depri, 
    actual_amount-Depri AS actualMinusDepri 
FROM (
    SELECT b.bank_v_id, 
     a.venumber, 
     b.recept_date, 
     b.dayly_amount, 
     b.actual_amount, 
     DATEDIFF(b.recept_date,'2015-03-09')*b.dayly_amount AS Depri 
    FROM bank_vehicle_master a 
    INNER JOIN tax_details b ON a.bank_v_id=b.bank_v_id 
    WHERE a.del_rec=0 AND b.del_rec=0 
) AS t 
ORDER BY bank_v_id 
1

Непосредственно использовать DateDiff участие в вычитании.

Также следует использовать синтаксис INNER JOIN вместо разделенного запятой соединения, которое невозможно прочитать.

SELECT b.bank_v_id, 
     a.venumber, 
     b.recept_date, 
     b.dayly_amount, 
     b.actual_amount, 
     (Datediff(b.recept_date, '2015-03-09') * b.dayly_amount)     Depri, 
     b.actual_amount - (Datediff(b.recept_date, '2015-03-09') * b.dayly_amount) AS Subtraction 
FROM bank_vehicle_master a 
     INNER JOIN tax_details b 
       ON a.bank_v_id = b.bank_v_id 
WHERE a.del_rec = 0 
     AND b.del_rec = 0 
ORDER BY a.bank_v_id 
Смежные вопросы