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