2016-05-22 5 views
0

Я создаю представление с двумя столбцами CASE. В последнем столбце мне нужно получить сумму этих полей case. Код нижеСумма столбцов CASE

CREATE VIEW full_return_data 
AS 
SELECT 
    return.ID_issuance, 
    CASE WHEN DATEDIFF(d, date_of_return, fact_date_of_return) <= 0 THEN 0 
     WHEN (fact_date_of_return is NULL) THEN book_local.price 
     ELSE DATEDIFF(d,date_of_return, fact_date_of_return) * 30 
    END AS fine1, 
    CASE WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 2 THEN book_local.price*0.2 
     WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 3 THEN book_local.price*0.4 
     WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 4 THEN book_local.price*0.6 
     WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 5 THEN book_local.price*0.8 
     WHEN (fact_date_of_return is NULL) THEN 0 
    END AS fine2, 
    (fine1 + fine2) AS fine 

FROM book_global INNER JOIN 
book_local ON book_local.ID_book_global = book_global.ID_book_global INNER JOIN 
book_exemplar ON book_exemplar.ID_book_local = book_local.ID_book_local INNER JOIN 
book_exemplar_condition ON book_exemplar_condition.ID_book_exemplar = book_exemplar.ID_book_exemplar INNER JOIN 
condition ON condition.ID_condition = book_exemplar_condition.ID_condition INNER JOIN 
issuance ON issuance.ID_book_exemplar = book_exemplar.ID_book_exemplar INNER JOIN 
[return] ON [return].ID_issuance = issuance.ID_issuance 

So ... (fine1 + fine2) AS отлично does'n работа. Как я могу решить эту проблему?

ответ

2

Один простой способ это сделать другую проекцию часть подзапроса

select a.ID_issuance,a.fine1,a.fine2,(a.fine1+a.fine2) from 
(SELECT 
    return.ID_issuance, 
    CASE WHEN DATEDIFF(d, date_of_return, fact_date_of_return) <= 0 THEN 0 
     WHEN (fact_date_of_return is NULL) THEN book_local.price 
     ELSE DATEDIFF(d,date_of_return, fact_date_of_return) * 30 
    END AS fine1, 
    CASE WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 2 THEN book_local.price*0.2 
     WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 3 THEN book_local.price*0.4 
     WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 4 THEN book_local.price*0.6 
     WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 5 THEN book_local.price*0.8 
     WHEN (fact_date_of_return is NULL) THEN 0 
    END AS fine2 

FROM book_global INNER JOIN 
book_local ON book_local.ID_book_global = book_global.ID_book_global INNER JOIN 
book_exemplar ON book_exemplar.ID_book_local = book_local.ID_book_local INNER JOIN 
book_exemplar_condition ON book_exemplar_condition.ID_book_exemplar = book_exemplar.ID_book_exemplar INNER JOIN 
condition ON condition.ID_condition = book_exemplar_condition.ID_condition INNER JOIN 
issuance ON issuance.ID_book_exemplar = book_exemplar.ID_book_exemplar INNER JOIN 
[return] ON [return].ID_issuance = issuance.ID_issuance) a 

Другим способ заключается в самом деле суммировать оба вашего саз, но он может получить уродливые

+0

работает как шарм! Благодаря! –

0

Вы можете сделать что-то вроде этого:

SELECT *, (fine1 + fine2) AS fine 
from (
    return.ID_issuance, 
    CASE WHEN DATEDIFF(d, date_of_return, fact_date_of_return) <= 0 THEN 0 
     WHEN (fact_date_of_return is NULL) THEN book_local.price 
     ELSE DATEDIFF(d,date_of_return, fact_date_of_return) * 30 
    END AS fine1, 
    CASE WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 2 THEN book_local.price*0.2 
     WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 3 THEN book_local.price*0.4 
     WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 4 THEN book_local.price*0.6 
     WHEN [return].ID_condition > book_exemplar_condition.ID_condition AND [return].ID_condition = 5 THEN book_local.price*0.8 
     WHEN (fact_date_of_return is NULL) THEN 0 
    END AS fine2 
) X 

С производной таблицы вы можете обратиться, чтобы подвести и другие расчетные столбцы из результирующего набора.

Другие варианты использования внешнего применения или CTE.

Смежные вопросы