使用SQL SELECT语句的长算法
基本思想是我有3个单独的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
(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。奇怪。