2013-06-07 2 views
1

저는 SQL Server에 익숙하지 않으며보기 및 열에서 열을 만드는 2 개의 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_idexpense id이 같은 경우 연간 열의 합계가 같아야합니다. 그러나 노동 조합의 절반에있는 항목은이 매개 변수가 모두 일치하는 경우에도 나머지 절반의 항목보다 다른 금액을가집니다.

본질적으로 내가해야 할 일은 합계가 계산을 할 때 합계 함수가 모든 항목을 노동 조합의 두 부분에서 보도록 합집합이 완료된 후 연간 열을 만드는 것입니다. 나는 SELECT에서 모든 것을 중첩하고, 노크의 두 부분에서 SUM 행을 옮기는 것에 대해 생각하고 있습니다. 그러나 이것이 작동하는지 또는 올바른 접근 방법인지는 알 수 없습니다.

미리 조언 해 주셔서 감사합니다. 그럼 당신이 할 수있는

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

:

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.*, 
     SUM(amount) OVER (PARTITION BY YEAR(posting_date), lease_id, expense_id)) as Annual 
from (<subquery1> 
     union 
     <subquery2> 
    ) t 

당신은 확인해야 할 수도 있습니다 모든 필드가 - - amount, posting_date, lease_id 및 expense_id - 하위 쿼리가 반환합니다.

+0

고맙습니다. 아주 가깝습니다. 웬일인지 그것은 expense_id를 좋아하지 않는다. 잘못된 열 이름 'expense_id'가 표시됩니다. SUM 함수의 다른 열 이름 앞에 "PR"이 붙어 있기 때문입니다. expense_id에는 ".E"접두사가 붙습니다. – user2414509

+0

@ user2414509 . . 두 개의 하위 쿼리 모두에 'expense_id'를 포함시켜야하기 때문입니다. 만약 최종보기에서 그것을 원하지 않는다면't. * '대신에 원하는 모든 열을 나열하십시오. –

+0

DONE.COM. 감사! expense_id를 알아 냈습니다. 이것은 효과가있는 것처럼 보입니다. 그래도 데이터를 확인해야하지만 올바르게 수정 된 것처럼 보입니다. – user2414509

관련 문제