嵌套的SELECT语句
SQL不是我的强项,但我正在努力上,谢谢答复。
我正在编写一份报告,该报告将返回我们合同中个性化服务的完成百分比。有一个主表"合同",每个单独的合同可以从"服务"表中获得多个服务,每个服务都有"标准"表的多个标准,其中记录了每个标准的完成百分比。
我已经计算出针对特定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完成百分比
[身份证] 100%
编辑:表未显示在帖子中。
解决方案
我们应该能够在其中选择要添加的公司名称和组以及服务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
我不确定我是否理解问题,如果service_contract的结果还可以,我们可以签约服务
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
确保我们具有从group by子句中的Contract表中选择的所有列
假设查询仅适用于一项服务,那么我们似乎就在那儿,就不用担心WHERE子句来获取所有结果了,GROUP BY将为每个结果处理一项服务。
只需加入"合同"表以显示与每个服务相关的合同,即可完成。
因为我们要按合同服务ID分组,所以我认为我们可以删除where子句,它应该计算所有联系服务ID的百分比。
如果dbo.Standard中没有该合同serviceid的记录,则可能需要将外部联接从合同服务表中移到dbo.Standard表中,以显示没有完成记录的合同。
我希望这是有道理的。。。在迁移到数据框架后,我的SQL变得生疏了。
除了删除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
(SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100
如果CompletionPercentage是一个int字段,我们将无法使用整数数学。每当我们用整数除以整数时,都需要将其乘以1.0,以确保将整数视为小数。否则49/100 = 0。