2014-01-29 127 views
0

我有一個小的挑戰試圖創建SQL視圖 - 挑戰

一個「進展中的工作視圖」我不相信我的發言是最好的或正確的,並導致一個錯誤「子查詢返回多個值「

我有三個關鍵表;

  • 任務
  • PurchaseOrderItem
  • 資源

有一個唯一的參考場跨越例如所有表任務.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語句中的所有選擇,所以我剛剛完成了前兩項。

此方法使用LEFT OUTER JOIN查詢總計由ta_seq進行的查詢。這些都保證只返回一個行/ ta_seq因爲這是怎麼也正在分組:

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 

我也用表的別名,因爲我發現schema.tablename格式讓我盲目的(而不是幫助我解碼錯過的子查詢)。 要放入缺失的列,只需將它們翻譯成如上所述的其他LEFT OUTER JOIN。

乾杯 -