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件。