SQL Server:如何使用多个表通过联接计算表的百分比?

SQL Server:如何使用多个表通过联接计算表的百分比?,sql,sql-server,asp-classic,Sql,Sql Server,Asp Classic,我需要找到具有打开的工单票据的资产的百分比。下面显示了带有一些虚拟数据的表的结构 Assets Table +---------------------+ | Asset_Number_PK | +---------------------+ | 56412 | | 56413 | | 56414 | | 56415 | +-----------------

我需要找到具有打开的工单票据的资产的百分比。下面显示了带有一些虚拟数据的表的结构

Assets Table
+---------------------+ 
|  Asset_Number_PK    |
+---------------------+
|  56412              |   
|  56413              |    
|  56414              |  
|  56415              |
+---------------------+ 

Statuses Table    
+-------------------++-------------------+
|  Open_Number      ||  Closed_Number    | 
+-------------------++-------------------+
|  5                ||  8                |             
|  2                ||  7                |        
|  9                ||  11               |        
+-------------------++-------------------+

Work_Orders Table   
+-------------------++-------------------++-------------------+
| WO_Status_Number  || WO_Description    || Asset_number      | 
+-------------------++-------------------++-------------------+
|  5                || Fix air handler   ||  56415            |
|  5                || Replace chiller   ||  56412            |        
|  5                || 2 fans 2nd fl     ||  56414            |       
|  7                || 4 fans 2nd fl     ||  56414            |    
|  7                || Fix Air duct      ||  56413            |  
+-------------------++-------------------++-------------------+  
我尝试了以下两个查询来计算百分比,但我的输出不正确:

sql = "SELECT DISTINCT COUNT(Asset_Number_PK) AS tol_open_assets " 
sql = sql & "FROM Assets WHERE Asset_Number_PK IN (SELECT a.Asset_Number " 
sql = sql & "FROM Work_Orders a, Statuses b, Assets c " 
sql = sql & "WHERE a.WO_Status_Number = b.Open_Number AND a.Asset_Number = c.Asset_Number_PK)"
myRs.Open sql,con,1,2
if myRs.eof then
 tol_open_assets = 0
else
 tol_open_assets = myRs("tol_open_assets")
end if
myRs.Close


sql = "SELECT COUNT(Asset_Number_PK) AS tol_assets FROM Assets"
myRs.Open sql,con,1,2
tol_assets = myRs("tol_assets")
myRs.Close

if tol_assets = 0 then
 tol_asset_percentage = 0
else
 tol_asset_percentage = round(100*tol_open_assets/tol_assets,0)
end if

response.write(tol_asset_percentage)
您的结果(75基于您的数据)显示为正确

您还可以在单个查询中确定未清资产的百分比:

SELECT 
  PercentOpen = SUM(COALESCE(openOrder.IsOpen, 0)) / COUNT(*) * 100
FROM Assets a
OUTER APPLY (
  SELECT TOP 1 IsOpen = CAST(1 AS DECIMAL(10,2))
  FROM Work_Orders wo 
  JOIN Statuses s ON wo.WO_Status_Number = s.Open_Number
  WHERE wo.Asset_Number = a.Asset_Number_PK
) openOrder

您的结果(基于您的数据为75)显示为正确

您还可以在单个查询中确定未清资产的百分比:

SELECT 
  PercentOpen = SUM(COALESCE(openOrder.IsOpen, 0)) / COUNT(*) * 100
FROM Assets a
OUTER APPLY (
  SELECT TOP 1 IsOpen = CAST(1 AS DECIMAL(10,2))
  FROM Work_Orders wo 
  JOIN Statuses s ON wo.WO_Status_Number = s.Open_Number
  WHERE wo.Asset_Number = a.Asset_Number_PK
) openOrder

在查询中,您使用了列
资产\u编号
,但此列在
资产
表定义中不存在。列
资产编号
是否可以为空?仅供参考:
COUNT(col\u name)
不计算
NULL
值。@Alex抱歉,这是一个输入错误。我现在将根据示例对其进行编辑,我看不出这个查询如何产生100%以上的结果。您是否尝试过检查中间值:tol_open_assets,tol_asset_percentage?@Alex我同意您的观点,但我在第一行发现了一些错误,应该是
sql=“选择计数(不同的资产编号)作为tol_open_assets”
我也注意到
不同的计数()
。但这并不是查询中唯一奇怪的事情:您还使用了非ANSI连接。假设Asset_Number_PK是主键且不能包含重复项,则这无关紧要。在查询中使用列
Asset_Number
,但此列不存在于
Assets
表定义中。列
资产编号
是否可以为空?仅供参考:
COUNT(col\u name)
不计算
NULL
值。@Alex抱歉,这是一个输入错误。我现在将根据示例对其进行编辑,我看不出这个查询如何产生100%以上的结果。您是否尝试过检查中间值:tol_open_assets,tol_asset_percentage?@Alex我同意您的观点,但我在第一行发现了一些错误,应该是
sql=“选择计数(不同的资产编号)作为tol_open_assets”
我也注意到
不同的计数()
。但这并不是查询中唯一奇怪的事情:您还使用了非ANSI连接。假设Asset_Number_PK是主键,不能包含重复项,那么这就没关系了。您的解决方案看起来很有希望,我想您可能会有所发现。我将尝试您的查询并用它测试一些过滤器。我不确定我们中的任何一方是否正确,因为我被告知我的解决方案不正确,所以我正在寻找其他解决方案。对于这个问题,我省去了其他表的过滤器,以找到查询的基础。另外,我正在处理大量资产,超过10000项。您的解决方案看起来很有希望,我想您可能会有所进展。我将尝试您的查询并用它测试一些过滤器。我不确定我们中的任何一方是否正确,因为我被告知我的解决方案不正确,所以我正在寻找其他解决方案。对于这个问题,我省去了其他表的过滤器,以找到查询的基础。另外,我处理了很多资产,超过10000件。