2008-09-24 115 views
3

SQL是不是我的专长,但我的工作就可以了 - 感谢您的答复。嵌套查询语句

我工作的报告,将返回服务的完成百分比在我们的合同indiviudals。有一个主表“合同”,每个单独的合同可以有多个来自“服务”表的服务,每个服务都有“标准”表的多个标准,它记录了每个标准的完成百分比。

我就计算总完成百分比为特定Contract_ServiceID每个单独的服务得到了,但我怎么回报大家对所有的合同服务的百分比?事情是这样的:

合同                   服务                   完成百分比


ABC公司   服务1               98%
ABC公司   服务2           100%
XYZ公司   服务1               50%

这是我到目前为止有:

SELECT 
    Contract_ServiceId, 
    (SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 as "Percent Complete"  
FROM dbo.Standard sta WITH (NOLOCK) 
     INNER JOIN dbo.Contract_Service conSer ON sta.ServiceId = conSer.ServiceId 
     LEFT OUTER JOIN dbo.StandardResponse standResp ON sta.StandardId = standResp.StandardId 
      AND conSer.StandardReportId = standResp.StandardReportId 

WHERE Contract_ServiceId = '[an id]' 
GROUP BY Contract_ServiceID 

这让我太:

Contract_serviceid          完成百分比


[一个id]                                                 100%

编辑:表没有显示在帖子中。

+0

你可以发布涉及的表的表结构,或至少是相关的领域?它会帮助我们弄清楚如何对你的查询进行短语。 – Dana 2008-09-24 15:57:46

回答

1

我不知道如果我理解这个问题,如果结果是正常的service_contract你canContract服务

SELECT con.ContractId, 
     con.Contract, 
     conSer.Contract_ServiceID, 
     conSer.Service, 
     (SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 as "Percent Complete"   
FROM dbo.Standard sta WITH (NOLOCK) 
     INNER JOIN dbo.Contract_Service conSer ON sta.ServiceId = conSer.ServiceId 
     INNER JOIN dbo.Contract con ON con.ContractId = conSer.ContractId 
     LEFT OUTER JOIN dbo.StandardResponse standResp ON sta.StandardId = standResp.StandardId 
       AND conSer.StandardReportId = standResp.StandardReportId 
GROUP BY con.ContractId, con.Contract, conSer.Contract_ServiceID, conSer.Service 

确保你拥有所有的从分组中的合同表中选择的列

1

您应该能够通过与服务ID在你选择要添加的公司名称和组和沟where子句...

也许是这样的:

SELECT 
    Contract, 
    Contract_ServiceId, 
    (SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 as "Percent Complete"   
FROM dbo.Standard sta WITH (NOLOCK) 
     INNER JOIN dbo.Contract_Service conSer ON sta.ServiceId = conSer.ServiceId 
     LEFT OUTER JOIN dbo.StandardResponse standResp ON sta.StandardId = standResp.StandardId 
       AND conSer.StandardReportId = standResp.StandardReportId 
GROUP BY Contract, Contract_ServiceID 
1

假设您的查询仅适用于一项服务,看起来就像您在那里的大部分方式,离开WHERE子句获取所有结果,您的GROUP BY将针对每个结果处理一项服务。

只需加入合同表格即可显示与每项服务相关的合同,即表示您已完成。

0

因为你是通过合同serviceid分组我认为你可以删除where子句,它应该计算所有联系人serviceids的百分比。

如果该合同serviceid的dbo.Standard中没有记录,则可能需要将合同服务表中的外部联接而不是留给dbo.Standard表,以显示没有完成记录的合同。

我希望这是有道理的......我的SQL在迁移到数据框架后变得生疏。

1

除了删除where子句和添加更多组条件之外,还需要注意每个表中的空记录。这需要将INNER JOIN更改为LEFT JOIN(除非您不想查看这些行)以及某些ISNULL来清理数据。我不确定StandardReportId概念在哪里落在这里,但它看起来像一个我不会玩弄的过滤机制。

SELECT 
    ContractID 
    ISNULL(Contract_ServiceId, '-1') -- or some other stand in value 
    ISNULL((SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100, 0) as "Percent Complete"   
FROM  
    Contract AS con 
    LEFT OUTER JOIN dbo.Contract_Service conSer ON con.ContractID = conSer.ContractID 
    LEFT OUTER JOIN dbo.Standard sta WITH (NOLOCK) ON conSer.ServiceId = sta.StandardID 
    LEFT OUTER JOIN dbo.StandardResponse standResp ON sta.StandardId = standResp.StandardId 
     AND conSer.StandardReportId = standResp.StandardReportId 
GROUP BY 
    ContractID, Contract_ServiceID 
0
(SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 

如果CompletionPercentage是一个int场你将不得不使用整数麻烦。任何时候你除以一个整数,你需要乘以1.0以确保它正在考虑数字作为小数。否则49/100会= 0.