2014-01-29 2 views
0

나는 내 문은 최고 또는 정확 확신하고 오류가 발생하고 있지 않다SQL보기 - 도전

는 "진행 뷰에서 작업"을 만들려고 작은 도전이 "하위 쿼리는 1 개 이상의 값을 반환 "

세 개의 키 테이블이 있습니다.

  • 작업
  • PurchaseOrderItem
  • 자원

고유 참조 필드가 예를 들어, 모든 테이블에 걸쳐있다 Tasks.TA_SEQ, PurchaseOrderItem.TA_SEQ 및 Resource.TA_SEQ

이 모든 테이블에서 서로 다른 합계를 계산해야하며 다음과 같은 관계가 있습니다.

  • 1 작업 - 많은 PurchaseOrderItem
  • 1 작업 - 많은 자원
  • 나는 또한 작업 및 활성 구매 주문에 대해 (라인 항목은 다를 수 있음) 모든 구매 주문 비용 값을 합산 할 필요가

모든 자원 비용 (3 명 - 수량이 다를 수 있음)을 작업에 대해 합산하면 모든 도움을받을 수 있습니다. 만약 내가 그것을 만들 수 있다면 더 쉽게 모든 조언을 부탁드립니다.

제 검색어의 일부는 그대로 있습니다.

SELECT 
    dbo.F_TASKS.TA_SEQ, 
    (
    SELECT 
     SUM(POI_TOTAL) 
    From F_PO_ITEM 
    where POI_FKEY_TA_SEQ = dbo.F_TASKS.TA_SEQ 
     and POI_FKEY_POH_SEQ in 
      (
      select 
       POH_SEQ 
      from F_PO_HEAD 
      where POH_STATUS in ('DORMANT', 'ACTIVE') 
      ) 
    ) AS [Pending PO Cost], 
    dbo.F_TASKS.TA_PO_COST AS [PO Cost], 
    dbo.F_TASKS.TA_LABOUR_COST AS [Labour Cost], 
    dbo.F_TASKS.TA_LABOUR_COST - SUM(dbo.F_TASK_TIME.TT_OTHER_COSTS) AS [New Labour Cost], 

-----------Not Working from 
(select 
    SUM(dbo.F_TASK_TIME.TT_OTHER_COSTS) 
from F_TASK_TIME 
where TT_FKEY_TA_SEQ = dbo.F_TASKS.TA_SEQ) + dbo.F_TASKS.TA_PO_COST AS [Subcontractor Costs], 
(SUM(dbo.F_TASK_TIME.TT_OTHER_COSTS + dbo.F_TASKS.TA_PO_COST)) * 0.12 AS [Subcontractor Uplift], 
((SUM(dbo.F_TASK_TIME.TT_OTHER_COSTS + dbo.F_TASKS.TA_PO_COST)) * 0.12) + (SUM(dbo.F_TASK_TIME.TT_OTHER_COSTS + dbo.F_TASKS.TA_PO_COST)) AS [Subcontractor Uplift Total] 

-----------Not Working To 

FROM dbo.F_TASKS 
LEFT OUTER JOIN dbo.F_TASK_TIME 
    ON dbo.F_TASKS.TA_SEQ = dbo.F_TASK_TIME.TT_FKEY_TA_SEQ 
LEFT OUTER JOIN dbo.F_PO_ITEM 
    ON dbo.F_TASKS.TA_SEQ = dbo.F_PO_ITEM.POI_FKEY_TA_SEQ 

WHERE (dbo.F_TASKS.TA_TASK_DESC = 'BREAKDOWN') 
    AND (dbo.F_TASKS.TA_PO_COST >= 0) 
    AND (dbo.F_TASKS.TA_STATUS IN ('ACTIVE', 'ASSIGNED', 'COMPLETE')) 

GROUP BY dbo.F_TASKS.TA_PO_COST, dbo.F_TASKS.TA_SEQ, dbo.F_TASKS.TA_LABOUR_COST 
+3

첫 번째는이 mysql 또는 SQLServer입니까? – Zane

+2

mysql 일 수 없습니다. '[]'괄호는 불평 할 것이다. –

+0

dbo. -> 99.99 %는 SQL Server입니다 :-). – Marian

답변

1

SQL을 수정하는 대신 다른 작업을 제안하려고합니다. select 절에있는 선택 항목에서 모든 wheres를 쉽게 이해할 수 없으므로 처음 두 개를 수행했습니다.

이 접근 방식은 LEFT OUTER JOIN을 ta_seq로 합계 한 쿼리에 사용합니다. 이들은 그이 많이 모여있는 방법으로 하나의 행/ta_seq을 반환 보장 : 나는은 schema.tablename 형식이 나를 장님하고있다 발견하면 나는 또한 테이블 별칭을 사용했습니다

SELECT 
    t.TA_SEQ, 
    isnull(po.poi_total, 0) [Pending PO Cost], 
    t.TA_PO_COST AS [PO Cost], 
    t.TA_LABOUR_COST AS [Labour Cost], 
    t.TA_LABOUR_COST - isnull(tt.other_costs, 0) AS [New Labour Cost], 
    -- other cols missed 
FROM dbo.F_TASKS t 
left outer join 
(
    t.ta_seq, SUM(POI_TOTAL) poi_total 
    From F_PO_ITEM poi 
    where POI_FKEY_POH_SEQ in 
    (
     select 
     POH_SEQ 
     from F_PO_HEAD 
     where POH_STATUS in ('DORMANT', 'ACTIVE') 
    ) 
    group by t.ta_seq 
) po on po.ta_seq = t.ta_seq 
left outer join 
(
    select tt.TT_FKEY_TA_SEQ ta_seq, sum(tt.tt_other_costs) other_costs 
    from F_TASK_TIME tt 
    group by tt.TT_FKEY_TA_SEQ 
) tt on tt.ta_seq = t.ta_seq 
WHERE (t.TA_TASK_DESC = 'BREAKDOWN') 
    AND (t.TA_PO_COST >= 0) 
    AND (t.TA_STATUS IN ('ACTIVE', 'ASSIGNED', 'COMPLETE')) 
GROUP BY t.TA_PO_COST, t.TA_SEQ, t.TA_LABOUR_COST 

(디코딩 나에게 도움이되지 누락 된 하위 쿼리). 누락 된 열을 넣으려면 위와 같이 LEFT OUTER JOIN을 추가로 변환하면됩니다.

환호 -