2013-06-07 9 views
1

Я довольно новичок в SQL Server, и я работаю с представлением, созданным из объединения двух операторов select, которые создают столбцы в представлении и используют внутренние соединения, левые внешние соединения и т. д.). См. Скрипт ниже.Нужно добавить вычисляемый столбец в сложный вид SQL Server

Я добавил строку

(SUM(PR.amount) OVER (PARTITION BY YEAR(PR.posting_date), PR.lease_id, E.expense_id)) as Annual 

создать столбец, который показывает годовую сумму отдельных ежемесячных расходов. К сожалению, поскольку линия SUM находится в обеих частях союза, я не получаю желаемого результата. Когда posting_date, lease_id и expense id совпадают, тогда сумма в годовом столбце должна быть одинаковой. Тем не менее, элементы в одной половине союза имеют разные суммы, чем элементы из другой половины союза, даже если все эти параметры совпадают.

По существу, то, что мне нужно сделать (я думаю), создает годовой столбец после завершения объединения, так что функция суммы видит ВСЕ элементы из обеих частей союза, когда он выполняет свои вычисления. Я думаю о том, чтобы вложить все это в SELECT и переместить линию SUM из двух частей профсоюза, но я не знаю, будет ли это работать или если это правильный подход.

Заранее благодарим за ваш совет.

create view xyz 
as 
SELECT  PR.amount_currency_code, CASE WHEN P.lease_payment_id IS NULL THEN PR.amount ELSE P.amount END AS amount, 
         CASE WHEN P.lease_payment_id IS NULL THEN PR.gl_code ELSE P.gl_code END AS gl_code, 
         CASE WHEN PR.one_time_expense_flag = 0 THEN 'N' ELSE 'Y' END AS One_Time_Flag, 
         dbo.UDF_getRentSummaryVendor(E.expense_id, P.lease_payment_id, PR.lease_projection_id) AS vendor, 
         dbo.UDF_getRentSummaryVendorNo(E.expense_id, P.lease_payment_id, PR.lease_projection_id) as vendor_no, 
         PS.name AS Payment_Status, PR.lease_id, PR.row_id, EC.name AS Expense_Category, P.payment_status_id, 
         PR.lease_projection_id, E.expense_status_id, PR.posting_date, 
         PR.scheduled_payment_date AS payment_date, PR.expense_category_id, 
       3 AS alloc_type, 
       'Non-Standard' AS alloc_type_desc, 
       'Check Details' as checkdetail, 

       (SUM(PR.amount) OVER (PARTITION BY YEAR(PR.posting_date), PR.lease_id, E.expense_id)) as Annual 

FROM   dbo.la_tbl_lease_projection AS PR INNER JOIN 
         dbo.la_tbl_lease AS L ON PR.lease_id = L.lease_id INNER JOIN 
         dbo.la_tlu_lease_status AS LS ON L.status_id = LS.status_id INNER JOIN      
         dbo.la_tlu_held_by AS HB ON L.heldby_id = HB.heldby_id INNER JOIN         
         la_tbl_lease_proj_nonstd_alloc AS PA on PA.lease_projection_id = PR.lease_projection_id and PA.menu_id_key = PA.menu_id_key and PA.percentage > 0 LEFT OUTER JOIN 
         dbo.la_tbl_expense AS E ON E.expense_id = PR.expense_id LEFT OUTER JOIN 
         dbo.la_tbl_lease_payment AS P ON PR.lease_projection_id = P.lease_projection_id LEFT OUTER JOIN 
         dbo.la_tlu_payment_status AS PS ON P.payment_status_id = PS.payment_status_id LEFT OUTER JOIN 
         dbo.la_tlu_expense_category AS EC ON PR.expense_category_id = EC.expense_category_id 
WHERE  (PR.IsDeleted = 0) AND (E.IsDeleted = 0 OR 
         E.IsDeleted IS NULL) 
         and HB.system_type <> '2' and HB.IsDeleted = 0 

union 

SELECT  PR.amount_currency_code, CASE WHEN P.lease_payment_id IS NULL THEN PR.amount ELSE P.amount END AS amount, 
         CASE WHEN P.lease_payment_id IS NULL THEN PR.gl_code ELSE P.gl_code END AS gl_code, 
         CASE WHEN PR.one_time_expense_flag = 0 THEN 'N' ELSE 'Y' END AS One_Time_Flag, 
         dbo.UDF_getRentSummaryVendor(E.expense_id, P.lease_payment_id, PR.lease_projection_id) AS vendor, 
         dbo.UDF_getRentSummaryVendorNo(E.expense_id, P.lease_payment_id, PR.lease_projection_id) as vendor_no, 
         PS.name AS Payment_Status, PR.lease_id, PR.row_id, EC.name AS Expense_Category, P.payment_status_id, 
         PR.lease_projection_id, E.expense_status_id, PR.posting_date, 
         PR.scheduled_payment_date AS payment_date, PR.expense_category_id, 

       CASE WHEN STDALLOC.menu_id_key IS NULL THEN 1 ELSE 2 END AS alloc_type, 
       CASE WHEN STDALLOC.menu_id_key IS NULL THEN 'None' ELSE 'Standard' END AS alloc_type_desc,  

       'Check Details' as checkdetail, 
       (SUM(PR.amount) OVER (PARTITION BY YEAR(PR.posting_date), PR.lease_id, E.expense_id)) as Annual 
FROM   dbo.la_tbl_lease_projection AS PR INNER JOIN 
         dbo.la_tbl_lease AS L ON PR.lease_id = L.lease_id INNER JOIN 
         dbo.la_tlu_lease_status AS LS ON L.status_id = LS.status_id INNER JOIN      
         dbo.la_tlu_held_by AS HB ON L.heldby_id = HB.heldby_id LEFT OUTER JOIN 
la_tbl_area_allocation AS STDALLOC on STDALLOC.area_allocation_term_id in 
(select area_allocation_term_id from la_tbl_area_allocat_term ALLOC_TERM 
where start_date = (select max(start_date) from la_tbl_area_allocat_term IN_ALLOC_TERM 
    where area_term_id in (select area_term_id from la_tbl_area_term TERM where PR.posting_date between TERM.start_date 
       and TERM.end_date and PR.lease_id = TERM.lease_id and TERM.isdeleted = 0) 
     and PR.posting_date between IN_ALLOC_TERM.start_date and IN_ALLOC_TERM.end_date) 
AND area_allocation_term_id = (select max(area_allocation_term_id) from la_tbl_area_allocat_term IN_ALLOC_TERM 
    where area_term_id in (select area_term_id from la_tbl_area_term TERM where PR.posting_date >= TERM.start_date 
       and PR.posting_date between TERM.start_date and TERM.end_date and PR.lease_id = TERM.lease_id and TERM.isdeleted = 0) 
     and PR.posting_date between IN_ALLOC_TERM.start_date and IN_ALLOC_TERM.end_date 
     and IN_ALLOC_TERM.start_date = (select max(start_date) from la_tbl_area_allocat_term INN_ALLOC_TERM 
    where area_term_id in (select area_term_id from la_tbl_area_term TERM where PR.posting_date >= TERM.start_date 
       and PR.posting_date between TERM.start_date and TERM.end_date and PR.lease_id = TERM.lease_id and TERM.isdeleted = 0) 
     and PR.posting_date between INN_ALLOC_TERM.start_date and INN_ALLOC_TERM.end_date)) 
and PR.posting_date >= ALLOC_TERM.start_date and PR.posting_date <= ALLOC_TERM.end_date 
and ALLOC_TERM.isdeleted = 0) 
and STDALLOC.percentage > 0 

       LEFT OUTER JOIN 
         dbo.la_tbl_expense AS E ON E.expense_id = PR.expense_id LEFT OUTER JOIN 
         dbo.la_tbl_lease_payment AS P ON PR.lease_projection_id = P.lease_projection_id LEFT OUTER JOIN 
         dbo.la_tlu_payment_status AS PS ON P.payment_status_id = PS.payment_status_id LEFT OUTER JOIN 
         dbo.la_tlu_expense_category AS EC ON PR.expense_category_id = EC.expense_category_id 
WHERE  (PR.IsDeleted = 0) AND (E.IsDeleted = 0 OR 
         E.IsDeleted IS NULL) 
         and HB.system_type <> '2' and HB.IsDeleted = 0 

       and PR.lease_projection_id not in (select distinct(lease_projection_id) from la_tbl_lease_proj_nonstd_alloc where isdeleted = 0) 
GO 
+3

Пожалуйста, для этого и будущего вопроса: попробуйте ** ограничить ** проблему до ** абсолютного минимума **, чтобы показать проблему. Не просто бросьте ** огромную кучу кода ** у нас и ожидайте, что мы пройдем через весь ваш T-SQL здесь ..... это просто ** слишком сложно **, чтобы начать его анализировать, без наличия вашей базы данных .... –

ответ

4

Вы можете исправить это путем реструктуризации запроса в представлении, как:

select t.* 
from (<subquery1> 
     union 
     <subquery2> 
    ) t 

Тогда вы можете сделать:

select t.*, 
     SUM(amount) OVER (PARTITION BY YEAR(posting_date), lease_id, expense_id)) as Annual 
from (<subquery1> 
     union 
     <subquery2> 
    ) t 

Вы могли бы быть уверены, что все поля - - количество, posting_date, lease_id и account_id - возвращаются подзапросами.

+0

Спасибо, что это очень близко. По какой-то причине ему не нравится price_id. В нем указано Недопустимое имя столбца «cost_id». Я полагаю, это связано с тем, что другие имена столбцов в функции SUM имеют префикс «PR». а price_id имеет префикс «.E»? – user2414509

+0

@ пользователь2414509. , , Это связано с тем, что вы должны включать 'account_id' в оба подзапроса в виде столбцов. Если вы не хотите этого в конечном представлении, то вместо 't. *', Перечислите все нужные вам столбцы. –

+0

DONE.COM. Благодаря! Я выяснил, что включает расход. Это работает. Все еще нужно проверять данные, но кажется правильным исправлением. – user2414509

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