SQL不是我的强项,但我正在努力 - 感谢您的回复。
我正在撰写一份报告,该报告将返回合同中个人服务的完成百分比。有一个主表“合同”,每个单独的合同可以从“服务”表中获得多个服务,每个服务都有多个标准的“标准”表,记录每个标准的完成百分比。
我已计算出特定Contract_ServiceID的每项服务的总完成百分比,但如何返回所有合同的所有服务百分比?像这样:
合同服务完成百分比
<小时/> abc公司服务1 98%
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百分比完成
编辑:表格没有显示在帖子中。
答案 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。