使用SQL SELECT语句的长算法

使用SQL SELECT语句的长算法,sql,sql-server,Sql,Sql Server,基本思想是我有3个单独的SELECT语句,它们输出一个数字。我需要从这些数字中提取一个百分比。所以问题是这样的: (a.count_one + b.count_two) - (b.count_two + c.count_three) / (a.count_one + b.Count_two) * 100 Select ((a.Count_one + b.Count_two) - (b.Count_two + c.Count_three)) / (a.Count_one + b

基本思想是我有3个单独的SELECT语句,它们输出一个数字。我需要从这些数字中提取一个百分比。所以问题是这样的:

(a.count_one + b.count_two) -
(b.count_two + c.count_three) / (a.count_one + b.Count_two) * 100
Select
    ((a.Count_one + b.Count_two) - (b.Count_two + c.Count_three)) 
    / (a.Count_one + b.Count_two) * 100 
    as 'Final_Percentage' 
from 

(
select CAST(COUNT(v_Summary.ResourceID) AS float) AS Count_one
From [DB1].[dbo].[v_Summary]
) a,


(
select CAST(count([CN]) AS float) as Count_two
From [DB2].[dbo].[Computers] 
WHERE cn NOT IN (SELECT name0 FROM [DB1].[dbo].[v_system] where v_system.Client0 = '1')
) b,


(
select CAST(COUNT(v_Summary.ResourceID) AS float) AS Count_three
From [DB1].[dbo].[v_Summary]
Where Description like '%/Fail'
) c
当我执行下面的代码时,我只得到第一个
(a.count\u one+b.count\u two)
的输出。但是如果我注释掉第三部分,即
/(a.count\u one+b.count\u two)
,我成功地从
(a.count\u one+b.count\u two)-(b.count\u two+c.count\u two)
中得到了正确的解决方案

看起来,对两个语句进行数学运算很好,但当我输入第三个语句时,它会呕吐,只想显示第一个问题的解决方案
(a.count\u one+b.count\u two)
,但甚至不再尝试计算
(a.count\u one+b.count\u two)-(b.count\u two+c.count\u two)
。我有点不明白为什么

Select
    (a.Count_one + b.Count_two) - 
    (b.Count_two + c.Count_three) / (a.Count_one + b.Count_two) * 100 
    as 'Final_Percentage' 
from 

(
select COUNT(v_Summary.ResourceID) AS Count_one
From [DB1].[dbo].[v_Summary]
) a,

(
select count([CN]) as Count_two
From [DB2].[dbo].[Computers] 
WHERE cn NOT IN (SELECT name0 FROM [DB1].[dbo].[v_system] where v_system.Client0 = '1')
) b,

(
select COUNT(v_Summary.ResourceID) AS Count_three
From [DB1].[dbo].[v_Summary]
Where Description like '%/Fail'
) c
并提供更多信息。关于数字的数学问题:

(54558 + 373) – (373 + 117) / (54558 + 373) * 100
或进一步解决:

(54931) - (490) / 55304 * 100 = 98.44%

COUNT
函数返回
int
。当您将两个
int
值相除时,结果在SQL Server中再次为
int
。所以,
490/55304
0
。然后
0*100
又是
0

将值强制转换为合适的类型,如
float

顺便说一下

(54931) - (490) / 55304 * 100 
不等于~98.44,等于~54930.11399 需要使用括号才能获得预期结果:

((54931) - (490)) / 55304 * 100 
等于~98.43953421

因此,最终查询应该如下所示:

(a.count_one + b.count_two) -
(b.count_two + c.count_three) / (a.count_one + b.Count_two) * 100
Select
    ((a.Count_one + b.Count_two) - (b.Count_two + c.Count_three)) 
    / (a.Count_one + b.Count_two) * 100 
    as 'Final_Percentage' 
from 

(
select CAST(COUNT(v_Summary.ResourceID) AS float) AS Count_one
From [DB1].[dbo].[v_Summary]
) a,


(
select CAST(count([CN]) AS float) as Count_two
From [DB2].[dbo].[Computers] 
WHERE cn NOT IN (SELECT name0 FROM [DB1].[dbo].[v_system] where v_system.Client0 = '1')
) b,


(
select CAST(COUNT(v_Summary.ResourceID) AS float) AS Count_three
From [DB1].[dbo].[v_Summary]
Where Description like '%/Fail'
) c

你也应该通过以下方式得到正确的结果

Select
100.*(a.Count_one - c.Count_three) / (a.Count_one + b.Count_two)
as 'Final_Percentage' 
from ... -- unchanged subqueries, as supplied in your question 

通过将
*100.
向右移动到前面,可以隐式地将第一个乘积转换为float,然后在剩余的计算中,该类型保持这种方式。另外,您可能已经注意到,我简化了公式,因为
b.Count\u two
从自身中减去,所以您可以完全忽略它。我没有对此进行测试,但我非常确信它会起作用。

我在代码中使用了
[]
dbo
添加了SQL Server标记。您还需要在这个表达式(a.Count\u one+b.Count\u two)-(b.Count\u two+c.Count\u two)周围加上括号,否则您将尝试将(b.Count\u two+c.Count\u two)除以(a.数一+b.数二)这不是你想要的谢谢Vladimir,这太完美了。很抱歉我的问题中的数学不好。严格来说,
100.0
不是
float
,它是SQL Server中的
decimal
。在这里它可能没问题,但也可能有它的怪癖。@Vladimir:谢谢你指出这一点!小数提供了38位数字来表示因此,对于这种类型的计算,数字应该是足够的,但你是对的,在处理真正大的数字(天文计算)时,它们可能会遇到问题。对于这些情况,浮点类型会更好,也请参见此处感谢您的帮助Cars10m,但不幸的是,第一个问题解决方案(在您的示例中为a.count_one-c.count_three)的结果与之前相同,但现在乘法移到前面后乘以100。奇怪。