嵌套的SELECT语句

时间:2020-03-06 14:40:17  来源:igfitidea点击:

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。