【问题标题】:Nested SELECT Statement嵌套 SELECT 语句
【发布时间】:2010-09-12 18:44:35
【问题描述】:

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%

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

【问题讨论】:

  • 你能发布所涉及的表的表结构,或者至少是相关字段吗?它将帮助我们弄清楚如何表达您的查询。

标签: sql sql-server tsql


【解决方案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】:

    您应该能够在您选择的公司名称和组中添加该名称和服务 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
    

    【讨论】:

      【解决方案3】:

      假设您的查询仅适用于一项服务,看起来您已经完成了大部分任务,请去掉 WHERE 子句以获取所有结果,您的 GROUP BY 将为每个结果提供一项服务。

      只需加入 合同 表以显示与每项服务相关的合同,然后就完成了。

      【讨论】:

        【解决方案4】:

        除了删除 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
        

        【讨论】:

          【解决方案5】:

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

          如果 dbo.Standard 中没有该合同 serviceid 的记录,您可能需要从合同服务表到 dbo.Standard 表进行左外连接,以便显示没有完成记录的合同。

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

          【讨论】:

            【解决方案6】:
            (SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 
            

            如果 CompletionPercentage 是一个 int 字段,您将无法使用整数数学。任何时候除以一个整数时,都需要将其乘以 1.0 以确保它将数字视为小数。否则 49/100 = 0。

            【讨论】:

              猜你喜欢
              • 2011-06-07
              • 1970-01-01
              • 2021-05-19
              • 1970-01-01
              • 2022-12-31
              • 2011-11-03
              • 2023-04-03
              • 2012-10-09
              • 1970-01-01
              相关资源
              最近更新 更多