SQL视图-挑战

SQL视图-挑战,sql,sql-server,view,Sql,Sql Server,View,我有一个小挑战,试图创建一个“正在进行的工作”视图 我不确信我的语句是最好的或正确的,并导致错误“子查询返回的值超过1” 我有三个关键表 任务 PurchaseOrderItem 资源 所有表格都有一个唯一的参考字段,例如Tasks.TA_SEQ、PurchaseOrderItem.TA_SEQ和Resource.TA_SEQ 我需要对所有这些表中的不同总计进行汇总,其关系如下: 1任务-多个PurchaseOrderItem 1任务-许多资源 我需要将所有采购订单成本值(行项目可能会有

我有一个小挑战,试图创建一个“正在进行的工作”视图

我不确信我的语句是最好的或正确的,并导致错误“子查询返回的值超过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

与其尝试修复您的SQL,我将提出一种不同的wau。我不能;我不容易理解select子句中select的所有内容,所以我只做了前两个

这种方法使用左外部联接来查询,查询总数按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格式使我失明(并且不能帮助我解码丢失的子查询)。 要放入缺少的列,只需将它们转换为额外的左外部联接,如上所述


干杯-

首先,这是mysql还是SQLServer?不可能是mysql。括号
[]
将投诉.dbo。->99.99%是SQL Server:-)。为标记错误道歉这是SQL Server您如何确定哪个子查询返回了多个值?