【发布时间】:2016-09-01 04:32:04
【问题描述】:
我将为以下等式找到最佳系数(Z):
[Target] = Z * SQRT(Mu_L * POWER(Sigma_D,2) + POWER(Mu_D,2) * POWER(Sigma_L,2))
我的数据集中有大约 100,000 行不符合 Target 级别。所以,我要找到通过目标级别的最小Z 值。每一行都是相同的,因此一行可能需要Z=34.5,而另一行可能需要Z=13.5。我想编写一个代码,通过循环检查每一行,直到所有行都达到所需的目标级别,并为所有行打印最佳 Z 值。
我写了这样的代码:
While (Select [Target] From dbo.product) < 1000
Begin
Update dbo.product
SET [Z] = Z + 0.5
Update dbo.product
SET [Target] = Z * SQRT(Mu_L * POWER(Sigma_D,2) + POWER(Mu_D,2) * POWER(Sigma_L,2))
IF (Select [Target] From dbo.product) > 1000
Break
Else
Continue
End
运行此查询后,我收到以下错误:
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
您知道如何解决此错误吗?而且你相信这段代码可以解决我的问题吗?感谢您的帮助!
【问题讨论】:
-
(Select [Target] From dbo.product)返回一个记录集,您无法将记录集与整数进行比较。 -
您可以使用 COUNT 函数作为 COUNT(Target)
-
@ydoow 谢谢你的评论。实际上,我看到了 Microsoft 的 While 函数示例,并且进行了几乎相同的比较。
(SELECT AVG(ListPrice) FROM Production.Product) < $300 -
所以应该是
While (Select MIN([Target]) From dbo.product) < 1000,因为你想确保所有[Target]都是>= 1000 -
如果您要将数据库表视为电子表格,最好使用真正的电子表格产品。理想情况下,在 SQL 中,您生成基于集合的解决方案(即,听起来您应该拥有一个包含所有可能的
Z值的表,然后将这两个表与合适的条件join您为每行选择符合您的条件的最低Z值)。
标签: sql sql-server