嵌套的SELECT语句

时间:2008-09-24 15:45:14

标签: sql sql-server tsql

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百分比完成

<小时/> [id] 100%

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

6 个答案:

答案 0 :(得分: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 :(得分:1)

我不确定我是否理解这个问题,如果结果对于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表中选择的所有列

答案 2 :(得分:1)

假设您的查询仅适用于一项服务,看起来就像您大部分时间一样,请不要使用 WHERE 子句获取所有结果, GROUP BY 将根据结果处理一项服务。

只需加入合约表即可显示与每项服务相关的合约,您就完成了。

答案 3 :(得分: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

答案 4 :(得分:0)

因为您按合约serviceid进行分组,我认为您可以删除where子句,并且应该计算所有联系服务的百分比。

如果dbo.Standard中没有该合约serviceid的记录,您可能需要将外部联接从合约服务表转到dbo.Standard表,以显示没有完成记录的合约。

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

答案 5 :(得分:0)

(SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 

如果CompletionPercentage是一个int字段,则整数数学会遇到问题。无论何时除以整数,都需要将其乘以1.0,以确保将数字视为小数。否则49/100会= 0。